目录:
一、使用UI信号槽自动连接的方式
(1)新建项目:双击UI文件打开UI界面,拖一个PushButton、textEdit控件到窗口中
(2)建立信号与槽步骤如下:
- 菜单栏中点击“编辑信号/槽”按钮
- 点击PushButton按钮后再点击窗口空白区域
- 配置连接中选择“clicked()”(点击)信号->右下角点击编辑
- 右边窗口中点击 + 新建名为“slot1()”的槽函数,右下角点击确定
- 选择左边的“clicked()”(点击)信号,选择右边的槽函数“slot1()”,点击确定
(3)声明on_pushButton_clicked();函数,定义该函数,点击按钮就触发信号啦
注意:void on_pushButton_clicked();要写在 public slots: 的下面
public slots: 是一个特殊的声明区域,用于声明该类的槽(slots)函数。槽是Qt信号和槽机制的一部分,它允许对象之间进行通信。当一个信号被发射(emit)时,任何连接(connect)到这个信号的槽都会被自动调用。
(代码量不大,作者就懒的贴了,关键部分框出来啦,手敲一遍可以加深记忆)
二、C++11引入Lamda表达式实现信号槽连接
Lambda表达式:在Qt中经常被用作槽函数,以简化信号与槽的连接,可以使用Lambda表达式来响应按钮点击事件,而无需单独定义一个槽函数。
例如:在UI窗口中拖入pushbutton_2、textEdit_2,使用connect连接按钮信号和Lamda表达式槽函数,具体的实现如图所示
connect(ui.pushButton_2, &QPushButton::clicked, this,[=]() {
ui.textEdit_2->append("Hello World!");
});
//connnect(信号的发送者,发送的具体信号,信号的接受者,信号的处理(槽))
// 参数1:信号的发送者
// 参数2:发送的信号(函数地址)
// 参数3:信号的接收者
//参数4:处理的槽函数(函数的地址)
三、自定义信号槽
方法:在类的声明中通过signals:
和slots:
关键字标记,并且类必须继承自QObject
或其子类,也就是函数指针连接
例如:在UI窗口中拖入pushbutton_3、textEdit_3,在类中声明信号和槽,并定义槽函数,使用connect连接signals信号和slots槽函数。
逻辑:按钮信号用来触发 Lamda 表达式中的槽函数 mySignal, mySignal 触发对应槽函数mySlots 向 textEdit 输出文本,具体的实现如图所示
connect(this, &QtWidgetsApplication7::mySignal, this, &QtWidgetsApplication7::mySlots);
//onnect函数用于将信号(signal)与槽(slot)连接起来。当信号被发射时,
//连接到该信号的槽函数将被自动调用
//从Qt5开始,connect函数引入了基于函数指针的语法,这使得连接信号和槽变得更加直观和类型安全。
四、QT4宏直接连接函数
(话不多说,直接看图)
//旧式语法(Qt 4及之前)(不建议使用)
connect(this,SIGNAL(mySignal()),this,SLOT(mySlots()));
//这行代码的含义是:将当前对象(this)的mySignal()信号连接到当前对象的mySlots()槽
//当mySignal()信号被发射时,mySlots()槽函数将被自动调用。
//新式语法(Qt 5及更高)(第五种写法)(建议)
connect(this, &QtWidgetsApplication7::mySignal, this, &QtWidgetsApplication7::mySlots);
五、QT5新写法
(话不多说,直接看图)
//新式语法(Qt 5及更高)(建议)
connect(this, &QtWidgetsApplication7::mySignal, this, &QtWidgetsApplication7::mySlots);
//注意几点:
//替换了SIGNAL()和SLOT()宏为直接引用成员函数的方式(使用&取地址符)。
//如果mySignal和mySlots是成员函数,需要指定它们所属的类名,除非这些函数是静态的。
//如果mySlots是槽函数且没有参数,那么不需要在函数名后加括号(mySlots而不是mySlots())。
其他:
代码自取:百度网盘 提取码: ag5a
https://pan.baidu.com/s/1rPm-BWAg2_niSoDB1N04ig?pwd=ag5a
双击.sln类型文件打开