信号和槽是Qt中类对象间进行交互的一种机制。比如单击窗口上的一个按钮后想要弹出一个对话框。那么用信号和槽的机制来实现就是按钮是发射信号的对象,信号是单击按钮,而槽就是一个写你接收到某个信号后要做的事情,在这里就是接收到单击信号后要执行的函数。
槽一般用slots关键字进行修饰
实现信号与槽机制有两种方法,下面我们以《Qt creator快速入门第三版》的03\3-4进行讲解
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
namespace Ui {
class MyWidget;
}
class MyWidget : public QWidget
{
Q_OBJECT
public:
explicit MyWidget(QWidget *parent = 0);
~MyWidget();
private:
Ui::MyWidget *ui;
public slots:
void showChildDialog();
//void on_showChildButton_clicked();
};
#endif // MYWIDGET_H
#include "mywidget.h"
#include "ui_mywidget.h"
#include <QDialog>
MyWidget::MyWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::MyWidget)
{
ui->setupUi(this);
connect(ui->showChildButton, &QPushButton::clicked,
this, &MyWidget::showChildDialog);
}
MyWidget::~MyWidget()
{
delete ui;
}
//void MyWidget::on_showChildButton_clicked()
//{
// QDialog *dlg = new QDialog(this);
// dlg->show();
//}
void MyWidget::showChildDialog()
{
QDialog *dialog = new QDialog(this);
dialog->show();
}
以上代码分别为MyWidget的类声明和类方法实现
方法一:connect手动关联
在类声明里声明一个槽:
修饰符 slots:
(函数声明)返回值 函数名(参数列表)
然后在方法实现中实现槽。
最后在类的构造函数里调用connect函数进行信号和槽的关联,connect的四个参数分别对应:发射信号的对象,发射的信号,接收信号的对象,要执行的槽。发射的信号和要执行的槽有两种写法,一种就是上图中的代码用类直接引出方法名然后在前面加上&。还有一种是用宏的方法表示,如:
connect(ui->showChildButton, SIGNAL(clicked()),this, SLOT(showChildDialog()));
第二种方式的信号和槽函数是可以带参的,但第一种就不清楚了,等有空了再回来看看。
方法二:自动关联
自动关联就是将关联函数整合到槽命名中去,这样就省去了connect函数,槽的命名规则为:字符on+_+发射信号的部件对象名+_+信号名。具体地可以看上述代码中注释掉的部分。