1.前言
为了处理个体间的通信事件,Qt提供了信号与槽。信号与槽不仅可以处理GUI上发生的事件,也可以实现个体间的数据通信。值得深入把握。
2.信号与槽
信号与槽是一种用于对象间通信的机制。为了用户在GUI程序点击按钮控件时可运行指定函数,信号与槽提供可运行指定函数的框架。处理多种用户事件前,信号和槽提供多种回调(Callback)函数。
Qt提供的所有控件拥有多种预设信号。例如,QPushButton控件的单击(click)双击(double click)、鼠标经过(mouse over)等多重信号。同时,槽也提供了多种虚函数(virtual function)。
信号用于处理发生的事件,而槽则是指定从信号接受事件的处理函数。因此,可以将信号和槽视为一个管道(pipeline).
根据上面的描述,我们也能注意到一个很重要的一点:信号与槽通常不是1:1匹配的。一个信号可以关联多个槽,一个槽也可以关联多个信号。示意图如下:
信号与槽之间的关联函数是connect函数。
3.典型实例
主文件 main.cpp:
头文件 mySigSlot.h:#include "mysigslot.h" #include <QtWidgets/QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); mySigSlot w; w.resize(400, 300); w.setWindowTitle("Example for Signal-Slot"); w.show(); return a.exec(); }
源文件 mySigSlot:#ifndef MYSIGSLOT_H #define MYSIGSLOT_H #include <QtWidgets/QWidget> #include "ui_mysigslot.h" #include <qlabel.h> /*********************************************************/ class mySigSlot : public QWidget { Q_OBJECT public: mySigSlot(QWidget *parent = 0); ~mySigSlot(); private: Ui::mySigSlotClass ui; private: QLabel* lbl; }; /*********************************************************/ class SignalSlot : public QObject { Q_OBJECT public: SignalSlot() { m_value = 0; } int value() const { return m_value; } public slots : void setvalue(int value); signals: void valueChanged(int newvalue); private: int m_value; }; /*********************************************************/ #endif // MYSIGSLOT_H
实现结果:#include "mysigslot.h" mySigSlot::mySigSlot(QWidget *parent) : QWidget(parent) { ui.setupUi(this); lbl = new QLabel("",this); lbl->setGeometry(10, 10, 100, 40); SignalSlot s1, s2; QObject::connect(&s1, SIGNAL(valueChanged(int)), &s2, SLOT(setvalue(int))); s1.setvalue(100); lbl->setText(QString("%1").arg(s2.value())); } mySigSlot::~mySigSlot() { } void SignalSlot::setvalue(int value) { m_value = value; //assignment //为了发送信号 使用关键字emit emit valueChanged(m_value); //emit signal }
信号与槽的流通过程:
首先定义原则“s1 的 valueChanged()函数被触发,那么s2将被赋予与s1相同的值”。先对s1赋值,该过程激发了信号函数s1.valueChanged(),从而相应“信号-槽”管道,s2.value()获得新值。最后显示在QLabel控件上。
4.参考资料
[1]. 金大 [zhen. Qt 5开发实战[M]. 人民邮电出版社, 2015.