理解信号和槽(一)
槽和信号术语
槽是标准的成员函数(作为类成员的函数)能够连接到信号,每当槽所连接的信号被发射时,槽(函数)就被执行
许多Qt类已经包含一些程序中可以使用的预定义槽。例如,QPushButton类所包含的clicked()函数
信号也是成员函数,当对象内部状态发生改变时发出信号。信号连接到槽,那么槽(函数)就被执行。可以将多个槽连接到同一个信号,这些槽会被依次执行,其执行顺序是任意的。
#include <QApplication> #include <QWidget> #include <QPushButton> #include <QFont> #include <QLCDNumber> #include <QSlider> class MyMainWindow : public QWidget { public: MyMainWindow(); private: QPushButton *b1; QLCDNumber *lcd; QSlider *slider; }; MyMainWindow::MyMainWindow() { setGeometry(100, 100, 300, 200); b1 = new QPushButton("Quit", this); b1->setGeometry(10, 10, 80, 40); b1->setFont(QFont("Times", 18, QFont::Bold)); lcd = new QLCDNumber(2, this); lcd->setGeometry(100, 10, 190, 180); slider = new QSlider(Qt::Vertical, this); slider->setGeometry(10, 60, 80, 130); //b1的clicked()信号连接到qApp的quit()槽。其结果导致点击b1时,程序退出 //slider的valueChanged()信号被连接到lcd的display()槽,一个int值在两个函数之间传递。这使得通过拖动滑块能够控制显示中所显示的数值 connect(b1, SIGNAL(clicked()), qApp, SLOT(quit())); connect(slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int))); } int main(int argc, char **argv) { QApplication a(argc, argv); MyMainWindow w; w.show(); return a.exec(); }
#include <QApplication> #include <QWidget> #include <QPushButton> #include <QFont> #include <QLineEdit> #include <QString> class MyMainWindow : public QWidget { public: MyMainWindow(); private: QPushButton *b1; QPushButton *b2; QPushButton *b3; QLineEdit *ledit; }; MyMainWindow::MyMainWindow() { setGeometry(100, 100, 300, 200); b1 = new QPushButton("Click here to mark the text", this); b1->setGeometry(10, 10, 280, 40); b1->setFont(QFont("Times", 18, QFont::Bold)); b2 = new QPushButton("Click here to unmark the text", this); b2->setGeometry(10, 60, 280, 40); b2->setFont(QFont("Times", 18, QFont::Bold)); b3 = new QPushButton("Click here to remove the text", this); b3->setGeometry(10, 110, 280, 40); b3->setFont(QFont("Times", 18, QFont::Bold)); ledit = new QLineEdit("This is a line of text", this); ledit->setGeometry(10, 160, 280, 30); connect(b1, SIGNAL(clicked()), ledit, SLOT(selectAll())); connect(b2, SIGNAL(clicked()), ledit, SLOT(deselect())); connect(b3, SIGNAL(clicked()), ledit, SLOT(clear())); } int main(int argc, char **argv) { QApplication a(argc, argv); MyMainWindow w; w.show(); return a.exec(); }
为了完全理解信号和槽,应该理解这几个术语
| 术语 | 解释 |
| 用户事件 | 指程序的用户所产生的事件。例如,点击鼠标或拖动滚动条 |
| 程序事件 | 指程序所产生的事件。例如,当用户点击鼠标后程序退出 |
| 发射信号 | 基本意思是指“发出”一个信号。例如,当你点击鼠标时,将发射clicked()信号。为了发射信号,使用emit关键字 |
| 内部状态 | 当谈论信号时。你可能听说过“内部状态已经改变”这意味着对象内部数据已发生改变,因此对象发射一个信号 |
| MOC | 元对象编译器用于构造用户自己的信号和槽。它处理Qt特有的关键字(例如emit),创建合法的C++代码。 |

浙公网安备 33010602011771号