什么是QT?
跨平台的C++图形用户界面程序框架
MinGW版本
优点?
-
跨平台
-
简化了内存回收机制(效率高)
-
嵌入式开发
-
市场份额大
成果:Linux桌面KDE,WPS,谷歌地图
1.main函数
#include"mywidget.h"
#include<QApplication>
int main(int argc, char *argv[])
{
//应用程序对象a,Qt中 有且仅有一个应用程序对象
QApplication a(argc, argv);
//创建MyWidget对象w,MyWidget基类QWidget
MyWidget w;
//弹出窗口(顶层方式弹出)
w.show();
//进入消息循环机制 pause
return a.exec();
}
2.pro文件(自动生成的代码)
QT += core gui //QT包含的模块,使用模块的时候要在Pro中添加模块
TARGET = 01_Qt_First//exe程序名
TEMPLATE = app//模板 应用程序
SOURCES += main.cpp\ //源文件
mywidget
HEADERS += mywidget.h //头文件
3.
//快捷键
帮助文档 F1
运行 ctrl + R
编译 ctrl + B
查找 ctrl + F
自动对齐 ctrl + i
注释 ctrl + /
Q_OBJECT //宏,有了这个就说明支持了Qt中的信号和曹机制
4.QPushButton
//使用类的时候不仅要添加头文件同时也要添加模块
#include<QPushButton>
MyWidget::MyWidget(QWidget *parent)
:QWidget(parent)
{
//按钮
QPushButton * btn1 = new QPushButton;
btn->setParent(this);
btn->setText("button1");//设置button按钮
//此方法也能创建按钮 但是窗口会按照btn2大小进行显示
QPushButton * btn2 = new QPushButton("button2",this);
//更改窗口大小
this->resize(w, h);
//移动按钮不然会被覆盖
btn2->move(x, y);
//设置窗口标题
setWindowTitle("");
//设置窗口固定大小
setFixedSize(w, h)
}
5.对象树
用继承的方式优化了资源回收
#include<QDebug>
qDebug() << "";
6.信号槽(Slote)
connect(信号的发送者,发送的信号(信号地址),信号的接收者,处理的函数——槽函数地址)
chicked(bool checked = false)//点击
pressed()//按下
released()//释放
toggled(bool checked)//切换状态,点一下再点一下是两种状态
优点:松散耦合
//点击按钮关闭
connect(mtBtn, &MyButton::clicked, this, close())
disconnect 断开信号
7.自定义信号和槽函数
头文件里
signal:
//自定义信号 需要写在signals下
//返回类型为void
//只需要声明 不需要实现
//可以有参数,可以重载
void hungry();
public slots:
//自定义槽函数
//高版本可以写在public或者全局条件
//返回值为void
//需要声明+实现
//可以有参数,可以重载
void treat();
cpp文件
void Student::treat()
{
qDebug() << "请老师吃饭";
}
需要触发事件才能进行捕捉信号并且处理
emit zt->hungry;
用函数指针来指向函数地址
有参和无参在耦合的时候无法区分函数
void(Teacher:: *teaherSignal)(QString) = &Teacher::hungry;//有参
void(Student:: *studentSlot)(QString) = &Student::treat;
void(Teacher:: *tSignal)(void) = &Teacher::hungry;//无参
void(Student:: *sSlot)(void) = &Student::treat;
信号可以连接信号
一个信号可以触发多个槽函数
多个信号也可以连接一个槽函数
信号和槽必须的参数一一对应(参数数量不一定)
信号参数的个数必须多于槽函数的函数个数
QT4版本
信号:SIGNAL()
槽:SLOT()
优点:参数直观 缺点:不会做类型检测
lambda表达式做信号连接的时候,默认内部变量会进行锁状态,只读状态,如果进行写操作数,就会挂掉
所以[&]{}{}换成[=](){}