qt Qt::QueuedConnection
时间: 2023-06-28 18:14:14 浏览: 218
`Qt::QueuedConnection` 是 Qt 中信号和槽的一种连接方式,用于在不同线程之间进行连接,实现线程安全的信号和槽通信。
在使用 `Qt::QueuedConnection` 连接信号和槽时,当信号被触发时,槽函数不会立即执行,而是将槽函数的执行放入事件循环中,等待下一次事件循环执行。这样可以保证槽函数的执行是在接收信号对象所在的线程中完成的,避免了线程安全问题。
下面是一个使用 `Qt::QueuedConnection` 连接信号和槽的例子:
```
class Worker : public QObject
{
Q_OBJECT
public:
Worker() {}
signals:
void valueChanged(int newValue);
public slots:
void doWork() {
int value = 0;
while (value < 100) {
++value;
emit valueChanged(value);
QThread::msleep(100);
}
}
};
class Widget : public QWidget
{
Q_OBJECT
public:
Widget() {
m_worker = new Worker();
m_thread = new QThread();
m_worker->moveToThread(m_thread);
connect(m_worker, &Worker::valueChanged, this, &Widget::updateValue, Qt::QueuedConnection);
connect(m_thread, &QThread::started, m_worker, &Worker::doWork);
m_thread->start();
}
~Widget() {
m_thread->quit();
m_thread->wait();
delete m_worker;
delete m_thread;
}
private slots:
void updateValue(int value) {
m_label->setText(QString::number(value));
}
private:
QLabel *m_label;
Worker *m_worker;
QThread *m_thread;
};
```
在这个例子中,我们创建了一个 Worker 类,它有一个 valueChanged 信号和一个 doWork 槽函数。在 doWork 函数中,它会每隔 100ms 发出一个 valueChanged 信号,将自增的值传递给信号的接收者。
在 Widget 类中,我们创建了一个 Worker 对象,并将它移动到一个新的线程中。通过 `Qt::QueuedConnection` 连接 Worker 的 valueChanged 信号和 Widget 的 updateValue 槽函数。当信号被触发时,槽函数的执行会被放入事件循环中,等待下一次事件循环执行。这样,updateValue 槽函数的执行就会在 Widget 所在的主线程中完成,避免了线程安全问题。
阅读全文