zoukankan      html  css  js  c++  java
  • 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 标志可以用来方式重复连接同一个信号和槽。

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

    [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);
    
  • 相关阅读:
    XSS跨站脚本攻击实例讲解,新浪微博XSS漏洞过程分析
    PHP常量PHP_SAPI与函数php_sapi_name()简介,PHP运行环境检测
    PHP导出数据到CSV文件函数/方法
    iOS8 Core Image In Swift:视频实时滤镜
    实战:mysql版本号升级
    Apache Shiro 使用手冊 链接文件夹整理
    Windows 驱动开发
    Python标准库:内置函数bytearray([source[, encoding[, errors]]])
    cocos2d-x 2.2.3 之菜单分析(1)
    JSP具体篇——out
  • 原文地址:https://www.cnblogs.com/cheungxiongwei/p/10895172.html
Copyright © 2011-2022 走看看