php网站代做是什么意思,档案网站建设的意义,wordpress 删除作者,唐山网站建设电话三、信号和槽
1.信号和槽概述
在Qt中#xff0c;用户和控件的每次交互过程称为一个事件。比如用户点击按钮”是一个事件#xff0c;用户关闭窗口”也是一个事件。每个事件都会发出一个信号#xff0c;例如用户点击按钮会发出按钮被点击的信号用户和控件的每次交互过程称为一个事件。比如用户点击按钮”是一个事件用户关闭窗口”也是一个事件。每个事件都会发出一个信号例如用户点击按钮会发出按钮被点击的信号用户关闭窗口会发出窗口被关闭的信号。
Qt中的所有控件都具有接收信号的能力一个控件还可以接收多个不同的信号。对于接收到的每个信号控件都会做出相应的响应动作。例如按钮所在的窗口接收到按钮被点击的信号后会做出关闭自己”的响应动作再比如输入框自己接收到输入框被点击的信号后会做出显示闪烁的光标等待用户输入数据”的响应动作。在Qt中对信号做出的响应动作就称之为槽。
信号和槽是Qt特有的消息传输机制它能将相互独立的控件关联起来。比如按钮和窗口”本身是两个独立的控件点击按钮”并不会对窗口造成任何影响。通过信号和槽机制可以将按钮和窗口关联起来实现点击按钮会使窗口关闭的效果。
Qt中谈到信号也是涉及到三个要素
信号源由哪个控件发出的信号信号的类型用户进行不同的操作就可能触发不同的信号信号的处理方式槽(slot)函数Qt中可以使用connect这样的函数把一个信号和一个槽关联起来后续只要信号触发了Qt就会自动的执行槽函数 槽本质是回调函数 2.connect函数
connect函数是QObject提供的静态的成员函数
connect函数原型旧版本
connect(const QObject *sender, //描述了哪个控件发出了信号const char * signal, //信号的类型const QObject * receiver, //信号处理哪个对象处理const char * method, //信号处理怎么进行处理Qt:ConnectionType type Qt:AutoConnection) //暂时不考虑很少使用有默认值
示例
ui-setupUi(this);QPushButton* button new QPushButton(this);button-setText(关闭);button-move(200,200);connect(button,QPushButton::clicked,this,Widget::close);
3.自定义槽
自定义一个槽函数操作过程和自定义一个普通的成员函数没什么区别
以前的槽函数必须放到public/private/protected slots:
protected slots此处是qt自己扩展的关键字不是C标准中的语法
Qt里广泛使用了元编程技术基于代码生成代码qmake构建qt项目的时候就会调用专门的扫描器扫描代码中特定的关键字给予关键字自动生成一大堆相关代码
①第一种创建方法
创建按钮处理机制为自定义函数 声明后实现自定义函数 ②第二种创建方法
先用ui文件拖一个控件 通过ui-pushButton获取到界面上拖进去的这个按钮然后实现该自定义函数 也可以直接在按钮上右击选择转到槽更推荐 直接生成好一个函数也完成了声明且没有connect因为在qt中除了通过connect来连接信号槽之外还可以通过函数名字的方式来自动连接
on_pushButton_clicked这部分是按钮的objectName当函数名渡河上述规则后qt就能自动把信号和槽建立起联系 4.自定义信号
自定义信号比较少见实际开发中很少会需要自定义信号
自定义槽函数非常关键开发中大部分情况都是需要自定义槽函数的
信号是一类非常特殊的函数程序员只要写出函数声明并告诉qt这是一个“信号”即可在声明的时候需要在signal关键字中这个函数的定义是在qt编译过程中自动生成的程序员无法干预信号在qt中是特殊机制qt生成的信号函数的实现要配合qt框架做很多既定的操作作为信号函数返回值必须是void有没有参数都可以甚至可以支持重载signals是qt自己扩展出来的关键字在自定义信号声明前加上qmake的时候会调用一些代码的分析/生成工具扫描到signal关键字的时候此时就会自动把下面的函数声明认为是信号并且给这些信号函数自动生成函数定义 5.带参数的信号和槽
Qt的信号和槽也支持带有参数同时也可以支持重载
此处我们要求信号函数的参数列表要和对应连接的槽函数参数列表一致
一致主要是要求类型个数可以不一致但是信号的参数的个数必须要比槽函数的参数个数要多
此时信号触发调用到槽函数的时候信号函数中的实参就能够被传递到槽函数的形参当中 QT中如果要让某个类能够使用信号槽可以在类中定义信号和槽则必须在类最开始的地方写下Q_OBJECT宏能展开成很多额外的代码
6.信号和槽的断开
使用disconnect来断开信号槽的连接
connect和disconnect使用方法很像
void Widget::on_pushButton_clicked()
{disconnect(ui-pushButton,QPushButton::clicked,this,Widget::on_pushButton_2_clicked);connect(ui-pushButton,QPushButton::clicked,this,Widget::on_pushButton_clicked);this-setWindowTitle(1);
}void Widget::on_pushButton_2_clicked()
{// 先断开原来的pushButton原来的信号槽disconnect(ui-pushButton,QPushButton::clicked,this,Widget::on_pushButton_clicked);// 重新绑定信号槽connect(ui-pushButton,QPushButton::clicked,this,Widget::on_pushButton_2_clicked);this-setWindowTitle(2);
} 7.lambda表达式定义槽函数
本质是一个匿名函数主要应用在“回调函数”场景中一次性使用 为解决上述问题引入了“变量捕获”语法 需要多个变量就用逗号隔开放在方括号中即可
如果想要把上层作用域所有变量名都捕获进来传入即可 还可以按照引用的方式来捕获[]但是qt中很少这么写捕获到的变量一般都是各种控件的指针指针变量按照值传递或者引用来传递都无所谓如果按引用还得更关注这个引用的变量本身的生命周期
如果对应的槽函数比较简单且一次性使用就会经常写这种lambda的形式 另外也需要确认捕获到lambda内部的变量是有意义的 回调函数执行时机是不确定的用户何时点击按钮是不知道的如果是像widget对象他在main函数中跟随进程结束销毁但是在访问其他的变量的时候要确保他在被使用的时候还未被销毁明确对象生命周期管理 lambda语法是C11中引入的如果对于QT5及其更高版本默认就是按照C11来编译的如果使用QT4或者更老的版本就需要手动在.pro文件中加上C11的编译选项CONFIG c11