qt 如何使用 lamda 表达式接收线程中发射的数据,并在里面更新 UI ?

Qt 信号和槽链接方式

常量 描述
Qt::AutoConnection (默认)若是接收方位于发出信号的线程中,则使用Qt::DirectConnection。不然,使用Qt::QueuedConnection。链接类型在信号发出时肯定。
Qt::DirectConnection 当发出信号时当即调用插槽。插槽在信号线程中执行。
Qt::QueuedConnection 当控件返回到接收方线程的事件循环时调用插槽。插槽在接收器的线程中执行
Qt::BlockingQueuedConnection 与Qt::QueuedConnection相同,只是发出信号的线程阻塞,直到插槽返回。若是接收方位于发出信号的线程中,则不能使用此链接,不然应用程序将死锁。
Qt::UniqueConnection 这是一个能够使用按位OR与上述任何一种链接类型组合的标志。 当设置Qt :: UniqueConnection时,若是链接已经存在,QObject :: connect()将失败(即,若是相同的信号已链接到同一对对象的相同插槽)。 这个标志在Qt 4.6中引入。

在 多线程中发射信号 ,在主线程中采用 lambda 表达式接收该信号。多线程

  1. 采用默认方式时,lambda 在多线程中运行。
  2. 采用 DirectConnection 时,lambda 在多线程中运行。
  3. 采用 QueuedConnection 时,lambda 在主线程中运行。
  4. 采用 BlockingQueuedConnection 时,lambda 在主线程中运行。

Qt::UniqueConnection 标志能够用来方式重复链接同一个信号和槽。函数

了解以上信号和槽的链接方式之后,能够用这个函数原型来更改接收方执行函数的线程this

[static] QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, const QObject *context, Functor functor, Qt::ConnectionType type = Qt::AutoConnection)
QObject::connect(this,&Widget::newData,this,[&](QString text){
        qDebug() << "slot thread ID:" << QThread::currentThreadId();
        QMessageBox::information(this,"test",text);
    },Qt::QueuedConnection);
相关文章
相关标签/搜索