一、信号与槽机制
1、信号
信号是一种特殊类型的成员函数。它们被定义为当某个事件发生时就被发射。当对象内部发生某些事件时,它能够发出信号。如果这个信号连接到槽,那么那个槽(函数)就被执行。可以将多个槽连接到同一个信号,那么这些槽就将一个接一个地被执行,其执行顺序是任意的。
2、槽
槽是标准的类成员函数,可以像调用其它函数一样调用它们。信号和槽关联后,每当槽所连接的信号被发射时,槽(函数)就被执行。许多QT类已经包含一些程序中可以使用的预定义槽。当编写Qt应用程序时,你会花费很多时间用于创建用户槽。当然,也可以创建自己的信号,但是大多数情况下预定义信号已经足够用。
二、使用信号与槽机制
1、方法一
F4为进入编辑信号与槽模式、F3为窗口编辑模式,我们可以通过其来进行切换ui界面编辑方式。
2、方法二
ui界面signal slots Edit方式,如图一所示例子:
3、方法三
最常规的用法,Qt4下使用(现在不推荐),如实现按钮关闭窗口:
(1)我们先定义一个按钮,后通过connect()函数来实现,在构造函数中添加以下代码:
QPushButton *btn = new QPushButton(this);
connect(btn, SIGNAL(clicked()), this,SLOT(myclicked()));`
(2)在.h文件中进行myclicked()槽函数声明,以及QPushButton库调用:
#include <QPushButton>
private slots:
void myclicked();
(3)我们可以通过右击自己声明的myclicked()函数,选择“Refactor”中的在.cpp中添加定义可快速生成函数的定义,并为其添加要实现的内容。例如:
void MainWindow::myclicked()
{
ui->label->setText(QObject::tr("起飞!!!"));
}
4、方法四
自动关联方式,button点右键"转到槽",会自动生成由字符on、发射信号的部件对象名和信号名组成的槽函数,例如:
on_pushButton_2_clicked();
5、方法五
connect()函数基于函数指针的重载形式,Qt5下使用(推荐使用),实现方法与方法三类似,只需在connect()函数中做以下更改:
connect(btn, &QPushButton::clicked, this, &MainWindow::myclicked);
6、方法六
手动提交,emit方式,
(1)在构造函数中添加以下代码:
connect(this, SIGNAL(mySignal()), this, SLOT(myclicked()));
(2)并添加调用,如下示例所示:
void MainWindow::on_pushButton_2_clicked()
{
ui->label_2->setText(QObject::tr("Hello"));
emit mySignal();
}
(3)使用此方法时,还要在.h文件中进行以下声明:
signals:
void mySignal();
7、方法七
lambda方法,在C++11下使用,在构造函数中添加以下代码:
connect(btn, &QPushButton::clicked, [btn](){
if(btn->text() == "lambda")
btn->setText("QST");
else
btn->setText("lambda");
});
注:使用此方法时,应在.pro文件中添加以下代码:
CONFIG += C++11