Qt基础学习
一、Qt 快捷键:
Ctrl + /快速注释
Ctrl + r 允许
Ctrl + b 编译
Ctrl + shift + 向上的箭头整行移动
Ctrl + I 自动对齐
F4 同名文件切换
F1 /左侧按钮 帮助文档
二、Qt.pro文件
TARGET 指向的的名字可以修改,修改工程名
TEMPLATE 指向的是模板
SOURCE 指向的是源文件
HEADERS 指向的是头文件
当我们创建一个类时,.pro文件就会自动增加数据
如果需要添加一些模块,我们可以在这直接写
三、Qt类的结构
1、基类的关系
- QMainWindow 是主窗口类,主窗口具有主菜单栏、工具栏和状态栏,类似于一般的应用程序的主窗口;
- QWidget 是所有具有可视界面类的基类,选择 QWidget 创建的界面对各种界面组件都可以 支持;
- QDialog 是对话框类,可建立一个基于对话框的界面;
2、对象树
从上到下构造,从下到上析构,只要指定了父亲,对象便会被自动挂到对象树中,析构的时候就会自动释放堆
3、Qdebug()的打印顺序
我们验证析构的时候却发现,第一个打印的并不是子类,
这只是Qdebug()的问题,他是先从父到下打印再从下到上析构的
4、Qt坐标轴
四、Qt的一些宏以及元对象编译器
1、moc
元对象编译器:
只有继承了QObject类的类,才具有信号槽的能力。所以,为了使用信号槽,必须继承QObject。凡是QObject类(不管是直接子类还是间接子类),都应该在第一行代码写上Q_OBJECT。不管是不是使用信号槽,都应该添加这个宏。这个宏的展开将为我们的类提供信号槽机制、国际化机制以及 Qt 提供的不基于 C++ RTTI 的反射能力。因此,如果你觉得你的类不需要使用信号槽,就不添加这个宏,就是错误的。其它很多操作都会依赖于这个宏。
Qt的信号/槽和属性系统都基于其能在运行时刻对对象进行实时考察的功能。实时考察意味着即使在运行过程中也可以列出一个对象有哪些方法(成员函数)和属性,以及关于它们的各种信息(比如参数类型)。如果没有实时考察这个功能,QtScript 和 QML 就基本不可能实现了。
C++本身不提供对实时考察的支持,所以Qt就推出了一个工具来提供这个支持。这个工具就是MOC。注意,它是一个代码生成器,而不是很多人说的“预编译器”。
MOC会解析头文件并为每一个含有Q_OBJECT宏的头文件生成一个对应的C++文件(这个文件会跟工程中的其他代码一块参与编译)。这个生成的C++文件包含了实时考察功能所需的全部信息(文件一般被命名为moc_HeaderName。cpp)。
参考:
https://blog.51cto.com/u_14582976/2828696
https://www.cnblogs.com/lsgxeva/p/12153288.html
2、emit
Emit在
qobjectdefs.h头文件中是空的宏定义,没有任何实际意思(除了对开发者有提示作用)
3、Signals
Signal则是public的宏,在Qt4之前是protected的宏,QT5之后才是Public的宏
4、Slots
Slots也是空的宏定义
五、信号与槽
1、槽函数,就是信号的处理
2、自定义信号
3、自定义槽函数
必须先用信号建立消息映射,再调用执行
4、自定义的信号与槽发生重载问题的解决
(一)、如下图,一个是有参的。一个是无参的信号与槽,如果我门用之前的方法是指不到带参函数的
(二)、为了解决connect的重载问题,需要创建函数指针,来填充connect函数:
(三)、输出的时候我们发现,这个QStirng字符串自带引号,为了不带引号,我们需要把QString类型转化成Char *类型
5、信号连接信号
(一)、
就这样连接,没什么好说的...
6、断开信号
断开信号:discnnect
7、Qt4版本信号与槽函数连接的写法:
8、注意事项(小节)
注意信号与槽函数的参数问题
六、又遇Lambda表达式
1、Lambda直接作为函数使用
在Lambda表达式后面加(),这是直接将Lambda当函数使用了,之前学stl的时候只见过他作为回调函数使用,长见识了...
2、Lamdba表达式的各个组成
3、用Lambda当作函数使用
用Lambda实现判断素数:
4、Lambda设置connect连接
甚至可以省略原来第三个参数this
七、阶段性作业
1、要求
用Qt创建一个按钮,设置按钮的文本为"打开一个窗口",点击这个按钮,弹出一个窗口,同时按钮上的文本变为”关闭这个窗口”;再次点击按钮则关闭这个窗口
2、所用函数(包含之前上课时用到的常用函数)
Show() //显示按钮
setParent() //设置父亲
setText()//设置文本
resize() //重置窗口大小//
setFixedSize() //固定窗口大小//
move() //移动btn按钮//
setWindowTitle //设置窗口标题//
3、代码
关键代码如下...
很简单,就不贴全码了
#include "work_widget.h" #include "ui_work_widget.h" #include "new_dialog.h" #include <QPushButton> #include <QDebug> Work_Widget::Work_Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Work_Widget) { ui->setupUi(this); new_Dialog* m = new new_Dialog; //创建按钮// QPushButton *btn = new QPushButton("打开一个新窗口",this); btn->move(100,0); QString qwe = "关闭这个新窗口"; connect(btn,&QPushButton::clicked,[=](){ qDebug()<<btn->text(); if(btn->text() == qwe) { btn->setText("打开一个新窗口"); m->close(); } else { m->show(); btn->setText("关闭这个新窗口"); } //new_Dialog m;//直接这样对象会被析构掉//应该定义在全局// }); } Work_Widget::~Work_Widget() { delete ui; }