一、Qt的介绍
Qt是一个跨平台的C++图形用户界面(GUI)的应用程序框架。
父类也叫基类
子类也叫派生类
二、Qt的框架
main.cpp文件
#include "mywidget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// 我们写的代码
return a.exec();
}
三、项目文件( .pro )
四、第一个Qt程序
新建一个空项目
添加main.cpp文件
【注意: 如果忘记写 w.show( ) ,则第一次运行时,是OK的,但没弹出窗口;
第二次运行,会报错。 因为其实代码在第一次运行时就一直在运行,没有关掉。
解决办法:先关掉第一次执行的代码】
设置标题
【QT上用MSVC去编译部分含有中文的字符串时会出现编译错误error: C2001: 常量中有换行符,但用MinGW就不会。需在后面加个正常的字符才能正常编译,但出现乱码了。其编码如下图】
五、父窗口和子窗口的区别(控件,部件,构件)
弹出两个独立的窗口,而我们想要的结果并不是这样,而是把按钮(窗口)放在另一个窗口上面,怎么办?
- 如果不指定父对象,对象和对象(窗口和窗口)没有关系,独立
- a指定b为它的父对象,a放在b的上面
- 指定父对象,有2中方式:
-
1)setParent
-
2)通过构造函数传参
- 指定父对象,只需要父对象显示,上面的子对象自动显示
即怎么指定父对象呢?
那怎么把按钮 移位呢?
刚才说将按钮放到 另一个窗口,除了上面介绍的setParent(), 那还有通过构造函数传参的方法呢?
即怎么 指定父对象?
六、信号和槽
重新创建工程: 【不用创建空项目了,以后创建的工程就是这样创建,它会给我们一个模板】
1. 信号和槽,信号类比于短信,槽类比于接收短信的手机
1)信号:普通函数(signals:),只需声明无需实现
2)槽函数:Qt 5 类中的任意成员函数,静态函数,全局函数,Lambda表达式
3)信号和槽可以使用Qt内部定义好的,也可以自定义
4)信号和槽式没有返回值,但是可以有参数
5)信号和槽的参数列表顺序必须一致
void sig1(int, double, char);
void slot1(int, double, char);
6)信号和槽的参数个数可以不一样
信号的参数个数可以大于槽函数参数的个数
槽函数个数不可以大于信号参数个数
2. 信号槽的扩展:
1)一个信号可以连接多个槽函数
槽函数执行的顺序是随机的,不能控制
2)一个槽函数可以被多个信号连接
3)信号可以连接信号
4)信号槽连接成功后,可以断开连接disconnect
5)槽函数可以是Lambda表达式
我们之前创建了有按钮的工程(代码放在main函数中),那我们实际上要怎么弄呢? 难道100个按钮都放在main函数中吗?
这肯定不是的,我们把按钮的代码放在子类MainWidget的构造函数中。
在mainwidet.cpp的构造函数中指定父对象, QPushButton b; 这样没用,因为执行完构造函数,对象b也会消失,所以到时候跳出构造函数代码,去执行main.cpp的 show( )时,已经没有b了
按钮那三行代码已经执行完就没有了,所以到时候后面的 w.show( ) 就显示不出来了
修改: 应该在 mainwidegt.h指定父对象 QPushButton b; 这样使得对象 b 在执行完构造函数时,对象b 依然存在
那怎么使得按钮 按下去有反应? 【标准信号和槽】
功能: 实现点击b1按钮close ; 则会关闭窗口
自定义槽
功能:实现对b2按钮的 按钮点击后,变化内容
功能: 实现2个独立窗口,都各自有一个按钮, 按下按钮,自身窗口消失,另一个窗口显示
已经完成一个窗口,那怎么新建另一个窗口呢?