系列文章目录
信号与槽(1)
目录
前言
例如:信号与槽是QT特有的通信机制,是QT的核心内容.
一、信号与槽是什么?
信号与槽机制的含义:每当我们发出一个信号,如果该信号有对应的槽函数,那么该槽函数就会被调用,做出相应回应。
看如下代码段:
//代码段1
#include <QObject>
class Counter : public QObject
{
Q_OBJECT
public:
Counter() { m_value = 0; }
int value() const { return m_value; }
public slots:
void setValue(int value);
signals:
void valueChanged(int newValue);
private:
int m_value;
};
//代码段2
connect(&a, &Counter::valueChanged, &b, &Counter::setValue);
在上述代码段1中,我们可以看到QObject类中拥有的signals,slot函数,这两者分别代表信号与槽。我们需要注意的是signals下的函数更像是一个函数声明,不需要定义,而slots函数是一个要被调用的函数,因此需要定义!!!代码段2展示了信号与槽调用的方式,通过connect函数来实现。在connect函数调用时有一点要注意:我们调用函数调用的是地址,而不是函数本身。
//错误示例
connect(&a, Counter::valueChanged(), &b, Counter::setValue());
二、信号与槽的实现
1.实现点击一个窗口中的按钮关闭该窗口:
在widgget.cpp文件中:
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
connect(ui->pushButton,&QPushButton::clicked,this,&Widget::close);
}
2.自定义一个信号与槽函数
信号:myclass1.h(添加一个myclass1类,以widget为基类)
class Myclass1 : public QObject
{
Q_OBJECT
public:
explicit Myclass1(QObject *parent = nullptr);
signals:
void MySignal(void);
public slots:
};
槽函数:myclass2.h(添加一个myclsass2类,已widget为基类)
class Myclass2 : public QObject
{
Q_OBJECT
public:
explicit Myclass2(QObject *parent = nullptr);
signals:
public slots:
void MySlot(int void);
};
槽函数实现:myclass2.cpp
void Myclass2:: MySlot(void){
qDebug() << "Got signal";
}
信号与槽调用:widget.h 创建mc1,mc2两个对象
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private slots:
void on_pushButton_2_clicked();
private:
Ui::Widget *ui;
Myclass1 *mc1;
Myclass2 *mc2;
};
widget.cpp:简单的connect函数,我们无法触发信号,所以我们用一个按钮来实现信号触发
ui(new Ui::Widget)
{
ui->setupUi(this);
mc1 = new Myclass1(this);
mc2 = new Myclass2(this);
connect(mc1,&Myclass1::MySignal,mc2,&Myclass2::MySlot);//无法触发信号
}
void Widget::on_pushButton_2_clicked()
{
//qDebug()<<"You have just clicked the button";
emit mc1->MySignal(num++);//emit 发送MySignal信号
}
总结
以上就是对QT信号与槽机制的简单介绍。