一、Qt是什么
Qt是跨平台的C++图形用户界面应用程序框架。
二、Qt的安装
下载网址:https://download.qt.io/archive/qt/
选择老一点的版本下载windows平台,登录Qt账号后一直点击下一步,组件不知道哪些有用就多选点
三、Qt的优点
- 跨平台,几乎支持所有的平台
- 接口简单,容易上手
- 一定程度简化内存回收机制
- 开发效率高,能快速创建应用程序
四、创建第一个程序
创建[Qt Widgets Application]
使用基类[QWidget]
// main.cpp
#include "mywidget.h"
#include <QApplication> //包含一个应用程序类的头文件
// main程序入口 argc是命令行变量的数量 argv是命令行变量的数组
int main(int argc, char *argv[])
{
// a应用程序对象,在Qt中,应用程序对象有且仅有一个
QApplication a(argc, argv);
// 窗口对象w myWidget的父类->QWidget
myWidget w;
// 窗口对象默认不会显示,必须要调用show方法显示窗口
w.show();
// 让应用程序对象a进入消息循环机制
return a.exec();
}
//mywidget.h
Q_OBJECT // Q_OBJECT宏,允许类中使用信号和槽的机制
五、命名规范和快捷键
命名规范
类名:首字母大写,单词和单词之间首字母大写
函数名、变量:首字母小写,单词和单词之间首字母大写
快捷键
注释 ctrl + /
运行 ctrl + r
编译 ctrl + b
字体缩放 ctrl + 鼠标滚轮
查找 ctrl + f
整行移动 ctrl + shift + ↑
自动对齐 ctrl + i
同名之间的.h和.cpp切换 F4
六、QPushButton
// 创建一个按钮
QPushButton * btn = new QPushButton;
// btn->show();// show以顶层方式弹出窗口控件
btn->setParent(this);
//显示文本
btn->setText("第一个按钮");
//创建第二个按钮 按照控件的大小创建窗口
QPushButton * btn2 = new QPushButton("第二个按钮", this);
//移动btn2按钮位置
btn2->move(100, 100);
//重置窗口大小
resize(600, 400);
//设置固定窗口大小
setFixedSize(600, 400);
//设置窗口标题
setWindowTitle("第一个窗口");
七、对象树
创建QObject对象时,会将这个QObject对象添加到父对象的children()列表
父对象析构的时候,会把列表中所有对象析构
Markdown将文本转换为 HTML。
八、信号和槽
槽就是信号的处理函数
信号槽的优点:
松散耦合,信号发送端和接收端本身是没有关联的,通过connect连接将两端耦合在一起。
//需求 点击我的按钮 关闭窗口
//参数1-信号的发送者 参数2-发送的信号 参数3-信号的接收者 参数4-处理的槽函数
connect(btn3, &QPushButton::clicked, this, &myWidget::close);
自写信号和槽
//.h文件
//槽函数返回值void,需要声明,也需要实现
//可以有参数,可以发生重载
void treat();
signals:
//自定义信号写到signals下
//返回值是void,只需要声明,不需要实现
//可以有参数,可以重载
void hungery();
//.cpp文件
//创建一个老师对象
this->tea = new Teacher(this);
//创建一个学生对象
this->stu = new Student(this);
//老师饿了,学生请客的连接
connect(tea, &Teacher::hungery, stu, &Student::thread);
//调用下课函数
classIsOver();
void Widget::classIsOver()
{
//下课函数,调用后,触发老师饿了
//信号需要触发
emit tea->hungery();
}
信号和槽发生重载的情况
使用函数指针,指向重载的函数地址
//连接带参数的,信号和槽
//指针->地址
//函数指针->函数地址
void(Teacher:: *teacherSignal)(QString) = &Teacher::hungery;
void(Student:: *studentSlot)(QString) = &Student::treat;
connect(tea, teacherSignal, stu, studentSlot);
//连接无参的信号和槽
void(Teacher:: *teacherSignal2)(void) = &Teacher::hungery;
void(Student:: *studentSlot2)(void) = &Student::treat;
connect(tea, teacherSignal2, stu, studentSlot2);
//断开信号
disconnect(tea, teacherSignal2, stu, studentSlot2);
信号与槽扩展
- 信号是可以连接信号的
- 一个信号可以连接多个槽函数
- 多个信号可以连接同一个槽函数
- 信号和槽函数的参数类型必须一一对应
- 信号的参数个数可以多于槽函数的参数
- 如果信号的发送者和接受者是一个,可以忽略接受者参数
九、Lambda表达式
C++1中的Lambda表达式用于定义并创建匿名的函数对象,以简化编程工作
[函数对象参数](操作符重载函数参数)mutable->返回值{函数体}
函数对象参数:
- 【=】局部变量都用值传递方式
- 【&】局部变量都用引用传递方式
- 【a】将a按值进行传递
- 【&a】将a按引用进行传递
加入mutable可以修改值传递的拷贝
//->返回值
int ret = []()->int{return 1000;}();