Qt不能在线程函数操作UI

这篇具有很好参考价值的文章主要介绍了Qt不能在线程函数操作UI。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  Qt的官方文档虽然并没有明确说明,不能在子线程中操作UI,但是,因为Qt是事件循环机制,所有的UI事件都是在主线程中处理的,如果在子线程中直接操作UI,就会存在线程安全问题,严重时候会使程序挂掉。
  但是有些场景确实需要在子线程中操作UI怎么办?以下是几种常用的解决方案:
  1. 使用信号槽机制
  这种方式是当子线程中需要对ui对象进行操作时,发出一个信号,在与之连接的槽中处理ui操作。信号和槽的连接方式必须是BlockingQueuedConnection 或QueuedConnection 的连接方式连接。
  2. 使用自定义event
  在子线程中通过QCoreApplication::postEvent 发出自定义的event,在对应的ui对象中重写customevent中处理自定义的event 。
  3. 使用QMetaObject::invokeMethod()函数
  该函数是一个静态函数,可以直接使用,用于调用对象的元对象方法 。该函数功能很强大,这里是用到了其可以在不同线程之间调用对象方法的特性。

  如果是新代码,可以在程序设计之初就处理好子线程与UI操作之间的协调处理,这种情况比较好办,可以使用方法1和方法2进行处理。但是如果是维护历史代码,重新做设计肯定是不现实的,所以就需要使用方法3进行处理,在子线程中操作UI的代码段,修改为QMetaObject::invokeMethod函数调用,可以做到最小程度的代码修改,下面给出具体例子:

// 在子线程中调用
int rowCount = 0;
REPORT_DE_INFO reportInfo;
bool b = QMetaObject::invokeMethod(this, "initTablewidget", Qt::BlockingQueuedConnection, Q_RETURN_ARG(int, rowCount), Q_ARG(REPORT_DE_INFO&, reportInfo));

  参数说明:
   参数1:调用对象指针
   参数2:调用的方法名
   参数3:连接方式,与信号槽连接函数connect的最后一个参数相同。对于这里是维护历史代码的场景,建议使用BlockingQueuedConnection,原来代码的执行逻辑一定是先执行完函数后才继续往下走,如果这里不给阻塞住,函数还没执行完,子线程就会继续往下走,很显然这与原来的代码逻辑并不相同,很可能会出现错误
   参数4:Q_RETURN_ARG宏,用来接收函数的返回值,宏的第1个参数是返回值类型,第2个参数是接收返回值的变量名
   参数5:Q_ARG宏,用来向函数传递参数,宏的第1个参数是函数参数的类型,第2个参数是传递参数的变量名,如果函数有多个参数,可以继续往下使用Q_ARG宏来传递
   返回值:bool类型,执行成功或者失败
   注意:执行的函数一定要是槽函数,否者回执行失败文章来源地址https://www.toymoban.com/news/detail-774874.html

到了这里,关于Qt不能在线程函数操作UI的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Java练习题汇总】《第一行代码JAVA》多线程篇,汇总Java练习题——线程及多线程概念、Thread 类及 Runnable 接口、线程状态、synchronized同步操作...

    一、填空题 Java 多线程可以依靠________ 、________ 和________ 三种方式实现。 多个线程操作同一资源的时候需要注意________,依靠________ 实现,实现手段是:________ 和________,过多的使用,则会出现________ 问题。 Java 程序运行时,至少启动________ 个线程,分别是________ 和_

    2024年02月16日
    浏览(41)
  • 深入探索:在std::thread中创建并管理QEventLoop的全面指南

    QEventLoop(事件循环)是Qt框架中的一个核心组件,它负责处理和分发各种事件,如用户的鼠标点击、键盘输入等。在Qt中,每个线程都可以有自己的事件循环,而主线程的事件循环则由Qt自动创建和管理。 QEventLoop的工作原理可以简单地理解为一个无限循环,它会不断地检查是

    2024年02月08日
    浏览(27)
  • 【QT多线程一】继承QThread,重写run函数

    Qt有两种多线程的方法,其中一种是继承QThread的run函数,另外一种是把一个继承于QObject的类转移到一个Thread里 。 在这里先介绍一下qt多线程的第一种实现方法,继承qthread并重写run函数。 注意 :QThread只有run函数是在新线程里的,其他所有函数都在QThread生成的线程里。如果

    2024年02月14日
    浏览(24)
  • QT中的耗时操作放到子线程中执行

    代码中有sleep的话,如果不放到子线程中执行,会将主线程卡死。 子线程的.h文件 子线程的.cpp文件 调用的地方的.h文件 调用的地方的.cpp文件

    2024年02月16日
    浏览(31)
  • Qt中UI对象只能在主线程中操作,那如何在子线程中操作UI呢

    在Qt中,UI对象只能在主线程中操作,因为Qt采用了事件循环机制,UI事件(如鼠标点击、键盘输入)都是在主线程中处理的。如果在子线程中直接操作UI对象,会导致线程安全问题。 如果需要在子线程中操作UI,可以采用信号槽机制或者Qt的线程间通信机制。 Qt中的信号槽机制

    2024年02月11日
    浏览(29)
  • Java 中创建线程的几种方式

    Java 是一种面向对象的编程语言,它支持多线程编程。多线程编程是指在一个程序中同时运行多个线程,这些线程可以并行执行,以提高程序的效率和性能。Java 提供了多种创建线程的方法,本文将介绍这些方法以及它们的优缺点。 Java 中的 Thread 类是一个抽象类,我们可以通

    2024年02月09日
    浏览(38)
  • QT子线程或自定义类操作访问主界面UI控件的几种方法

            QT创建窗体工程,一般在MainWindow或Dialog类里可以直接通过ui指针访问控件,但是添加新的类后又如何访问呢,可以通过以下几种方式: (1)例如有个自己定义的类CustomClass,在自定义类里包含主界面指针MainWindow * class MainWindow;   class CustomClass { public:     CustomCla

    2024年02月09日
    浏览(44)
  • Python多线程之_thread与threading模块

    Python多线程之_thread与threading模块 在Python程序中,多线程的应用程序会创建一个函数,来执行需要重复执行多次的程序代码,然后创建一个线程执行该函数。一个线程是一个应用程序单元,用于在后台并行执行多个耗时的动作。 在多线程的应用程序中,每一个线程的执行时间

    2024年02月04日
    浏览(31)
  • 【Linux操作系统】多线程抢票逻辑——学习互斥量(锁)函数接口

    临界资源 : 多线程执行流共享的资源就叫做临界资源 。 临界区 :每个线程内部, 访问临界资源的代码,就叫做临界区 。 互斥 :任何时刻, 互斥保证有且只有一个执行流进入临界区,访问临界资源,通常对临界资源起保护作用 。 原子性 :不会被任何调度机制打断的操作

    2024年02月16日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包