qt 信号槽队列连接工作原理及例子
时间: 2023-09-25 16:13:36 浏览: 266
Qt中的信号和槽是一种基于事件的通信机制,用于在对象之间传递信息。当一个对象的状态发生改变时,它会发出一个信号,其他对象可以连接到这个信号,并在信号触发时执行相应的槽函数。
信号和槽的连接是通过一个队列来实现的。当一个信号触发时,它会将相应的槽函数添加到队列中,等待下一次事件循环执行。这样可以保证槽函数的执行是在事件循环中完成的,避免了线程安全问题。
下面是一个简单的例子,展示了如何使用信号和槽连接:
```
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;
};
void Counter::setValue(int value)
{
if (value != m_value) {
m_value = value;
emit valueChanged(value);
}
}
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
Counter counter;
QLabel label;
QPushButton button("Add");
QObject::connect(&button, &QPushButton::clicked, [&counter]() {
counter.setValue(counter.value() + 1);
});
QObject::connect(&counter, &Counter::valueChanged, &label, &QLabel::setNum);
QVBoxLayout layout;
layout.addWidget(&label);
layout.addWidget(&button);
QWidget window;
window.setLayout(&layout);
window.show();
return app.exec();
}
```
这个例子中,我们创建了一个 Counter 类,它有一个 value 成员变量和一个 setValue 槽函数。当 setValue 函数被调用时,它会检查新的值是否和当前值相同,如果不同则更新值,并发出一个 valueChanged 信号。我们还创建了一个 QLabel 和一个 QPushButton,通过连接信号和槽,当按钮被点击时,Counter 的值会自增,并显示在标签上。
在 `QObject::connect` 中,我们将 QPushButton 的 clicked 信号连接到 Counter 的 setValue 槽函数,将 Counter 的 valueChanged 信号连接到 QLabel 的 setNum 槽函数。这样,每次 Counter 的值发生改变时,就会自动更新 Label 上的显示。
阅读全文