C++11新特性
nullptr 空指针
auto 自动类型
Lamda表达式 匿名函数
for each 新循环遍历方式
Lamda表达式定义函数语法:
[可访问外部变量](参数)->返回值{函数体}
[变量名1,变量名2.....](){} 指定部分变量访问
[=](){} 值传递形式捕获外部所有变量 (内部无法改变实际变量)
[&](){} 引用形式捕获外部所有变量 (内部可以改变实际变量)
一、常用按钮控件
1.创建 QPushButton *btn = new QPushButton;
2.设置父亲 setParent();
3.设置文本 setText();
4.设置窗口大小 resize();
5.设置标题 setWindowTitle();
6.设置固定大小 setFixedSize();
7.设置位置 move();
二、QT对象树介绍
对象树:QT中的类的继承关系,有一定程度上简化了对象释放操作。由QT的QObject类派生出来的类,无需手动释放堆内存 添加到QObject或QObject派生类的对象的子成员时,也无需手动释放,程序结束时QT会自动检测对象树的对象 ,释放对象前,先释放子对象,从而一层一层的最终释放完毕。
// 设置一个按钮
// 鼠标 按下 打印申闹被打了
// 鼠标 抬起 打印申闹反抗了
auto btnMouse = new QPushButton("申闹",this);
btnMouse->move(300,0);
//当按钮点击时
connect(btnMouse,&QPushButton::pressed,[]()->void{
qDebug()<<"老鼠被打了";
});
//抬起时
connect(btnMouse,&QPushButton::released,[]()->void{
qDebug()<<"申闹反抗了";
});
三、信号(Signal)和槽(Slot)
信号和槽:是QT框架引以为豪的东西 实际上就是观察者模式,一种简易方式。
使用connect函数,可以为信号以及槽建立好连接,当信号广播(触发)时,槽作出相应的处理。
信号来自于被观察者 槽来自于观察者
用法1:connect(被观察者,信号,观察者,槽);
用法2:connect(被观察者,信号,Lamda表达式匿名函数);
用法3:connect(被观察者,SIGNAL(信号函数),观察者,SLOT(槽函数));//老版本用法
Signal(信号):函数声明,无需实现。系统大多数类,都内置了信号,开发者也可以自定义信号。
Slot(槽):本质就是个函数,一般是类的成员函数。有声明且有实现体。系统大多数类,都内置了槽,开发者也可以自定义槽。
代码示例:
//最大化按钮(被观察者)
auto btnMax = new QPushButton("最大化",this);
//this窗口 观察者
//建立信号和槽连接
connect(btnMax,&QPushButton::clicked,this,&QWidget::showMaximized);
/*老版本QT4以前,信号和槽的绑定方式*/
auto btnMaxOld = new QPushButton("Old最大化",this);
connect(btnMaxOld,SIGNAL(clicked()),this,SLOT(showMaximized()));
四.自定义信号和槽
QT内置了大量的信号和槽,也支持用户自定义信号和槽
自定义槽:
1.有函数声明且有实现
2.返回值类型为void
3.槽函数 可以带参 可以重载 (槽函数实参 从信号而来)
自定义信号:
1.写在signals:下
2.只需声明 无需实现
3.返回值为void
4.可以带参 可以重载
5.emit 可触发信号
自定义信号和槽特点:
1.一个信号可以被多个槽绑定
2.同一个槽函数可以绑定多个信号
3.信号和槽的函数参数列表需一一对应
4.信号的参数表可以多于槽函数的参数表,反之不可以
5.信号可以绑定信号
信号和槽 断开连接:
disconnect();断开连接
connect();连接
class Boss : public QWidget
{
Q_OBJECT
public:
//explicit关键字 修饰函数 参数 无法自动转换类型
explicit Boss(QString _name,int _exe,QWidget *parent = nullptr);
QString name;//名字
int experience;//经验
signals://信号定义
//自定义信号
void BossDeadSignal();//定义死亡信号
void BossDeadSignal(int);//定义死亡信号 重载
public slots:
//自定义槽函数
void BossDeadSlot();//boss死亡槽函数
void BossDeadSlot(int);//boss死亡槽函数 重载
};
//重载后无参 连接无参的信号和槽
void (Boss::*deadSignalN)() = &Boss::BossDeadSignal;//信号指针
void (Boss::*bossDeadSlotN)() = &Boss::BossDeadSlot;//槽指针
connect(mboss,deadSignalN,mboss,bossDeadSlotN);//死亡信号触发后 死亡槽函数处理打印
//boss死亡信号触发后,角色获得经验
mrole = new Role;
//重载后无参 连接带参的信号和槽
void (Boss::*deadSignalY)(int) = &Boss::BossDeadSignal;//信号指针
void (Role::*getExeY)(int) = &Role::GetExe;//槽指针
connect(mboss,deadSignalY,mrole,getExeY);