char * 先转成QByteArray (.toUtf8() ) 再转char * ()">
当前位置:   article > 正文

Qt:学习笔记一

Qt:学习笔记一

 一、工程文件介绍

1.1 main.cpp 

  1. #include "widget.h"
  2. #include <QApplication> // 包含一个应用程序类的头文件
  3. //argc:命令行变量的数量;argv:命令行变量的数组
  4. int main(int argc, char *argv[])
  5. {
  6. //a应用程序对象,在Qt中,应用程序对象有且仅有一个
  7. QApplication a(argc, argv);
  8. //窗口对象 Widget父类-》QWidget
  9. Widget w;
  10. //窗口对象 默认不会显示,必须调用show方法显示窗口
  11. w.show();
  12. //让应用程序对象进入消息循环,代码堵塞到当前行
  13. return a.exec();
  14. }

1.2 project1.pro

  1. QT += core gui //Qt包含的模块
  2. greaterThan(QT_MAJOR_VERSION, 4): QT += widgets //大于4版本以上,包含widget模块
  3. CONFIG += c++11 //配置中多加c++11
  4. DEFINES += QT_DEPRECATED_WARNINGS
  5. before Qt 6.0.0
  6. SOURCES += \ //源文件
  7. main.cpp \
  8. widget.cpp
  9. HEADERS += \ //头文件
  10. widget.h
  11. FORMS += \
  12. widget.ui

1.3 widget.h

  1. #ifndef WIDGET_H
  2. #define WIDGET_H
  3. #include <QWidget>
  4. QT_BEGIN_NAMESPACE
  5. namespace Ui { class Widget; }
  6. QT_END_NAMESPACE
  7. class Widget : public QWidget
  8. {
  9. Q_OBJECT //Q_OBJECT宏,允许类中使用信号和槽的机制
  10. public:
  11. Widget(QWidget *parent = nullptr); //构造函数
  12. ~Widget(); //析构函数
  13. private:
  14. Ui::Widget *ui;
  15. };
  16. #endif // WIDGET_H

1.4 快捷键

1.注释: ctrl + /

2.运行: ctrl + r

3.编译: ctrl + b

4.查找: ctrl + f

5.整体移动: ctrl + shift + 向上箭头 或 向下箭头

6. 帮助文档: F1

7.自动对齐: ctrl + i


二、 常用操作

2.1 文档使用

2.2 常用操作 

  1. Widget::Widget(QWidget *parent)
  2. : QWidget(parent)
  3. , ui(new Ui::Widget)
  4. {
  5. ui->setupUi(this);
  6. //创建一个按钮
  7. QPushButton* btn = new QPushButton;
  8. //btn->show(); //show以顶层方式弹出窗口控件
  9. //让btn对象 依赖在Widget窗口中
  10. btn->setParent(this);
  11. //重置按钮大小
  12. btn->resize(100,100);
  13. //显示文本
  14. btn->setText("第一个按钮");
  15. //重置窗口大小
  16. resize(600,400);
  17. //设置固定窗口大小
  18. setFixedSize(400,400);
  19. //移动btn按钮
  20. btn->move(200,200);
  21. //设置窗口标题
  22. setWindowTitle("第一个窗口");
  23. }

2.3 调用析构函数 

Qt中关闭窗口会自动调用析构,从底层一步步向上析构 

当创建的对象在堆区时候,如果指定的父亲是 Qobiect派生下来的类或者Qobject可以不用管理释放的操作,将对象会放入到对象树中

2.4 坐标系


三、信号与槽 

3.1

参数一:信号的发送者

参数二:发送的信号(函数地址)

参数三:信号的接受者

参数四:处理槽函数(函数地址)

connect(btn, &QPushButton::clicked, this, &Widget::close);

  1. Teacher.h
  2. //自定义信号
  3. signals:
  4. //自定义信号,写到signals下
  5. //返回值是void,只需要声明,不需要实现
  6. //可以有参数,可以重载
  7. void hungry();
  8. Student.h
  9. //自定义槽函数
  10. public slots:
  11. //槽函数,可以写到public slots,也可以写到public全局下
  12. //返回值void,需要声明,也需要实现
  13. //可以有参数,可以发生重载
  14. void treat();
  15. //emit,触发自定义信号
  16. void Widget::classIsover()
  17. {
  18. //下课函数,调用后,触发老师饿了的信号
  19. emit zt->hungry();
  20. }

 3.2 自定义信号和槽函数出现重载

  1. //Student.h
  2. public slots:
  3. //槽函数,可以写到public slots,也可以写到public全局下
  4. //返回值void,需要声明,也需要实现
  5. //可以有参数,可以发生重载
  6. void treat();
  7. void treat(QString foodName);
  8. };
  9. //Teacher.h
  10. signals:
  11. //自定义信号,写到signals下
  12. //返回值是void,只需要声明,不需要实现
  13. //可以有参数,可以重载
  14. void hungry();
  15. void hungry(QString foodName);
  16. };
  17. //student.cpp
  18. void Student::treat()
  19. {
  20. qDebug() << "请老师吃饭";
  21. }
  22. void Student::treat(QString foodName)
  23. {
  24. //QString->char * 先转成QByteArray (.toUtf8() ) 再转char * ()
  25. qDebug() << "请老师吃饭,老师吃:"<<foodName.toUtf8().data();
  26. }
  27. //widget.cpp
  28. //带参
  29. //函数指针->函数地址
  30. void (Teacher:: *teacherSignal)(QString) = &Teacher::hungry;
  31. void (Student:: *studentSlot)(QString) = &Student::treat;
  32. connect(zt, teacherSignal, st, studentSlot);
  33. classIsover();
  1. MainWindow::MainWindow(QWidget *parent)
  2. : QMainWindow(parent)
  3. , ui(new Ui::MainWindow)
  4. {
  5. ui->setupUi(this);
  6. //点击新建按钮,弹出一个对话框
  7. connect(ui->actionnew, &QAction::triggered, [=](){
  8. //对话框 分类
  9. //模态对话框(不可以对其他窗口进行操作);非模态对话框(可以对其他窗口进行操作)
  10. //1.模态创建
  11. QDialog dlg(this);
  12. dlg.resize(200,100); //调整弹出的对话框大小
  13. dlg.exec();
  14. qDebug() << "模态对话框弹出了";
  15. //2.非模态对话框
  16. QDialog *dlg2 = new QDialog(this);
  17. dlg2->resize(200,100);
  18. dlg2->show();
  19. dlg2->setAttribute(Qt::WA_DeleteOnClose);
  20. qDebug() << "模态对话框弹出了";
  21. //3.错误对话框
  22. QMessageBox::critical(this,"critical","错误");
  23. //4.信息对话框
  24. QMessageBox::information(this,"info","信息");
  25. //5.提问对话框
  26. //1.父亲 2.标题 3.提示内容 4.按键类型 5.默认回车关联按键
  27. if(QMessageBox::Save==QMessageBox::question(this,"que","提问",QMessageBox::Save|QMessageBox::Cancel,QMessageBox::Cancel))
  28. qDebug()<<"选择的是保存";
  29. else
  30. qDebug()<<"选择的是取消";
  31. //6.警告对话框
  32. QMessageBox::warning(this,"warning","警告");
  33. //其他标准对话框
  34. //7.颜色对话框
  35. QColor qc = QColorDialog::getColor(Qt::red);
  36. QColor qc = QColorDialog::getColor(QColor(255,0,0));
  37. qDebug() << "r = "<<qc.red() <<"g = " << qc.green()<<"b = "<<qc.blue();
  38. //8.文件对话框
  39. //返回值是选取的路径
  40. QString str = QFileDialog::getOpenFileName(this, "打开文件", "C:\\Users\\hp\\Desktop",".txt");
  41. qDebug() << str;
  42. //9.字体对话框
  43. bool flag;
  44. QFont f = QFontDialog::getFont(&flag, QFont("宋体"),this, "设置字体");
  45. qDebug() << "字体:"<< f.family().toUtf8().data() <<"字号:"<<f.pointSize()<<"加粗:"<<f.bold();
  46. });
  47. }

四、控件

4.1 按钮组件

4.1.1Tool Button

1.给按钮添加图片并设置大小:icon

2.按钮背景透明:QToolButton -> autoRaise

3.图片后加文字:text + toolButtonStyle -> ToolButtonTextBesideIcon


4.1.2 Radio Button

1.分组:Containers-》Group Box

2.设置默认选择: ui->rbtnMan->setChecked(true);


4.1.3 Check Box 

  1.除用clicked,也可以用stateChanged
  connect(ui->checkBox, &QCheckBox::stateChanged, [=](int state){             qDebug() << state;});

//点击输出2,取消勾选输出0

2. 半选状态:tristate

//0是未选,1是半选,2是选择


4.2 QList、QTree、QTable


4.3 其他常用控件


五、自定义控件封装

5.1 改变数字,滑动条跟着移动,反之

1.添加新文件 - Qt - 设计师界面类(.h .cpp .ui);

2. 副ui(smallwidget)中设计QSpinBox和QSlider两个控件;

3. 在主ui中添加widget,点击提升为smallwidget类;实现副窗口在主窗口出现

  1. //valueChanged函数重载,需要用函数指针的形式
  2. void (QSpinBox:: *ptr)(int) = &QSpinBox::valueChanged;
  3. //数字改变,滑动条移动
  4. connect(ui->spinBox, ptr, ui->horizontalSlider, &QSlider::setValue);
  5. //滑动条移动,数字改变
  6. connect(ui->horizontalSlider, &QSlider::valueChanged, ui->spinBox, &QSpinBox::setValue);

5.2 添加按钮控制

  1. //在smallwidget.cpp中添加
  2. //设置num,数字和滑动条跟着变化
  3. void smallWidget::setNum(int num)
  4. {
  5. ui->spinBox->setValue(num); //ui指副窗口
  6. }
  7. //获取当前数字
  8. int smallWidget::getNum()
  9. {
  10. return ui->spinBox->value();
  11. }
  1. //在mainwidget.cpp中
  2. //此处ui是主窗口,ui->widget调用副窗口功能
  3. connect(ui->getButton, &QPushButton::clicked, [=](){
  4. qDebug() << ui->widget->getNum();
  5. });
  6. //数字设置为50
  7. connect(ui->setButton, &QPushButton::clicked, [=](){
  8. ui->widget->setNum(50);
  9. });

六、Qt中的事件

6.1 鼠标事件

1.鼠标进事件      enterEvent(QEvent *event)

2.鼠标离开事件

3.鼠标按下     mousePressEvent(QMouseEvent *ev)

4.鼠标释放

5.鼠标移动

1.ev->x(): x坐标; ev->y(): y坐标

   ev->gloalX: 全局下x坐标; ev->gloalY: 全局下y坐标

2.ev->button(): 可以判断所有按键,Qt::LeftButton

3.ev->buttons(): 判断组合键,判断move时候的左右键,结合 & 操作符

4.格式化字符串:QString("%1  %2").arg(111).arg(222);

  1. myLable::myLable(QWidget *parent)
  2. : QLabel(parent)
  3. {
  4. //与mouseMoveEvent进行联动
  5. setMouseTracking(true);
  6. }
  7. //1.鼠标进入事件
  8. void myLable::enterEvent(QEvent *event)
  9. {
  10. qDebug() << "鼠标进入了";
  11. }
  12. //2.鼠标离开事件
  13. void myLable::leaveEvent(QEvent *event)
  14. {
  15. qDebug() << "鼠标离开了";
  16. }
  17. //3.鼠标按下
  18. void myLable::mousePressEvent(QMouseEvent *ev)
  19. {
  20. if(ev->button() == Qt::LeftButton)
  21. {
  22. QString str = QString("鼠标按下 x = %1, y = %2, globalX = %3, globalY = %4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
  23. qDebug() << str;
  24. }
  25. }
  26. //4.鼠标释放
  27. void myLable::mouseReleaseEvent(QMouseEvent *ev)
  28. {
  29. if(ev->button() == Qt::LeftButton)
  30. {
  31. qDebug() << "鼠标释放";
  32. }
  33. }
  34. //5.鼠标移动
  35. //按下和释放是瞬间的,移动是一个过程
  36. void myLable::mouseMoveEvent(QMouseEvent *ev)
  37. {
  38. // if(ev->buttons() & Qt::LeftButton) //用=,两个按键同时按下错误,用&限制左键
  39. // {
  40. QString str = QString("鼠标移动 x = %1, y = %2, globalX = %3, globalY = %4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
  41. qDebug() << str;
  42. // }
  43. }

6.2 定时器

6.2.1 一个定时1s,一个定时2s

1.利用事件  void timerEvent(QTimerEvent *event) 进行触发

2.启动定时器  id1 = startTimer(1000); //单位毫秒,返回值作为区别定时器的标识

3.利用event->timerId()与id1进行判断

  1. Widget::Widget(QWidget *parent)
  2. : QWidget(parent)
  3. , ui(new Ui::Widget)
  4. {
  5. ui->setupUi(this);
  6. id1 = startTimer(1000); //单位毫秒
  7. id2 = startTimer(2000);
  8. }
  9. void Widget::timerEvent(QTimerEvent *event)
  10. {
  11. if(event->timerId() == id1)
  12. {
  13. static int num1 = 1;
  14. ui->label_2->setText(QString::number(num1++));
  15. }
  16. else if(event->timerId() == id2)
  17. {
  18. static int num2 = 1;
  19. ui->label_3->setText(QString::number(num2++));
  20. }
  21. }

6.2.2 实现定时器的第二种方式

  1. Widget::Widget(QWidget *parent)
  2. : QWidget(parent)
  3. , ui(new Ui::Widget)
  4. {
  5. ui->setupUi(this);
  6. //定时器的第二种启动方式
  7. QTimer* timer1 = new QTimer(this); //this放入对象树中
  8. timer1->start(500);
  9. connect(timer1, &QTimer::timeout, [=](){
  10. static int num3 = 1;
  11. ui->label_4->setText(QString::number(num3++));
  12. });
  13. connect(ui->pushButton, &QPushButton::clicked, [=](){
  14. timer1->stop();
  15. });
  16. }

6.3 事件分发器和事件过滤器


6.4 绘图事件

6.4.1 常用操作

  1. Widget::Widget(QWidget *parent)
  2. : QWidget(parent)
  3. , ui(new Ui::Widget)
  4. {
  5. ui->setupUi(this);
  6. }
  7. void Widget::paintEvent(QPaintEvent *event)
  8. {
  9. //实例化画家对象,this指定的是绘图设备
  10. QPainter painter(this);
  11. //设置画笔
  12. QPen pen(QColor(255, 0, 0));
  13. //设置画笔宽度
  14. pen.setWidth(3);
  15. //设置画笔风格
  16. pen.setStyle(Qt::DotLine);
  17. //让画家使用这个笔
  18. painter.setPen(pen);
  19. //设置画刷
  20. QBrush brush(Qt::cyan);
  21. //设置画刷风格
  22. brush.setStyle(Qt::Dense7Pattern);
  23. //让画家使用画刷
  24. painter.setBrush(brush);
  25. //画线
  26. painter.drawLine(QPoint(0,0), QPoint(100,100));
  27. //画圆 椭圆
  28. painter.drawEllipse(QPoint(100,100),50,50);
  29. //画矩形
  30. painter.drawRect(QRect(100,100,50,50));
  31. //画文字
  32. painter.drawText(150,150,QString("好好学习"));
  33. }

 6.4.2 高级设置

  1. QPainter painter(this);
  2. painter.drawEllipse(QPoint(100,50),50,50);
  3. //设置抗锯齿能力
  4. painter.setRenderHint(QPainter::Antialiasing);
  5. painter.drawEllipse(QPoint(200,50),50,50);
  6. //画矩形
  7. painter.drawRect(QRect(100,100,100,100));
  8. //移动画家
  9. painter.translate(100,0);
  10. //保持画家状态
  11. painter.save();
  12. painter.drawRect(QRect(100,100,100,100));
  13. painter.translate(100,0);
  14. //还原画家状态
  15. painter.restore();
  16. painter.drawRect(QRect(100,100,100,100));

6.4.3 定时器加手动调用绘图

  1. QPainter painter(this);
  2. if(this->width() < Posx )
  3. Posx = 0;
  4. painter.drawPixmap(Posx, 0, QPixmap(":/4.jpg"));
  5. //开启定时器
  6. QTimer *timer1 = new QTimer(this);
  7. timer1->start(500);
  8. //连接定时器与绘图
  9. connect(timer1, &QTimer::timeout, [=](){
  10. Posx += 20;
  11. //手动调哟个绘画事件,用update()
  12. update();
  13. });

6.4.4  QPixmap绘图设备

  1. //QPixmap绘图设备,专门对平台做了显示优化
  2. QPixmap pix(300, 300);
  3. //填充背景颜色
  4. pix.fill(Qt::white);
  5. //创建画家对象,&pix在创建的绘图设备上绘图
  6. QPainter painter(&pix);
  7. painter.setPen(QColor(Qt::red));
  8. painter.drawEllipse(QPoint(100, 100),50, 50);
  9. pix.save("F:\\Qt\\QtProject\\pix.jpg");

6.4.5 QImage绘图设备

  1. //QImage绘图设备
  2. QImage img(0,0,QImage::Format_RGB32);
  3. img.fill(Qt::white);
  4. QPainter painter(&img);
  5. painter.setPen(QColor(Qt::blue));
  6. painter.drawEllipse(QPoint(100, 100),50, 50);
  7. pix.save("F:\\Qt\\QtProject\\pix2.jpg");
  8. //像素修改
  9. void Widget::paintEvent(QPaintEvent *event)
  10. {
  11. QPainter painter(this);
  12. //利用QImage对像素进行修改
  13. QImage img;
  14. img.load(":/4.jpg");
  15. //修改像素点
  16. for(int i=50; i<100; i++)
  17. {
  18. for(int j=50; j<100; j++)
  19. {
  20. QRgb value = qRgb(255,0,0);
  21. img.setPixel(i,j,value);
  22. }
  23. }
  24. painter.drawImage(0,0,img);
  25. }

6.4.6 QPicture绘图设备

  1. //QPicture绘图设备 可以记录和重现绘图指令
  2. QPicture pic;
  3. QPainter painter;
  4. painter.begin(&pic);
  5. painter.setPen(QPen(Qt::cyan));
  6. painter.drawEllipse(QPoint(100, 100),50, 50);
  7. painter.end();
  8. pic.save("F:\\Qt\\QtProject\\pix2.zt"); //图片后缀可以任意
  9. void Widget::paintEvent(QPaintEvent *event)
  10. {
  11. //重现QPicture的绘图指令
  12. QPainter painter(this);
  13. QPicture pic;
  14. pic.load("F:\\Qt\\QtProject\\pix2.zt");
  15. painter.drawPicture(100,100,pic);
  16. }

七、QFile文件

7.1 文件读写

  1. Widget::Widget(QWidget *parent)
  2. : QWidget(parent)
  3. , ui(new Ui::Widget)
  4. {
  5. ui->setupUi(this);
  6. connect(ui->pushButton, &QPushButton::clicked, [=](){
  7. QString path = QFileDialog::getOpenFileName(this,"打开文件","C:\\Users\\hp\\Desktop");
  8. ui->lineEdit->setText(path);
  9. //QFile默认的支持格式是utf-8
  10. QFile file(path);
  11. //设置打开方式
  12. file.open(QIODevice::ReadOnly);
  13. QByteArray arry = file.readAll();
  14. ui->textEdit->setText(arry);
  15. file.close();
  16. //以追加方式进行写
  17. file.open(QIODevice::Append);
  18. file.write("帮到你人");
  19. file.close();
  20. });
  21. }

7.2 QFileInfo文件信息类

  1. //QFileInfo
  2. QFileInfo info(path);
  3. qDebug()<<"大小:"<<info.size()<<"后缀名:"<<info.suffix()<<"文件名称:"<<info.fileName()<<"文件路径:"<<info.filePath();
  4. qDebug()<<"创建日期:"<<info.created().toString("yyyy/MM/dd hh:mm:ss");
  5. qDebug()<<"最后修改日期:"<<info.lastModified().toString("yyyy-MM-dd hh:mm:ss");

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/490273
推荐阅读
相关标签
  

闽ICP备14008679号