一种在子线程中操作Qt的ui对象的优雅方式

问题

Qt有一个比较让人困扰的问题:不允许在子线程中对ui对象进行操作,否则会导致程序崩溃或者出现一些诡异的问题。解决这个问题的方法大致有两个:

  1. 通过信号槽连接,大体思路:当子线程中需要对ui对象进行操作时,发出一个信号,在与之连接的槽中处理ui操作。信号和槽的连接方式必须是BlockingQueuedConnectionQueuedConnection的连接方式连接。
  2. 通过自定义event,在子线程中通过QCoreApplication::postEvent发出自定义的event,在对应的ui对象中重写customevent中处理自定义的event
GuiThreadRun类

上述这两种方式都可以解决问题,但不够优雅,借助c++11一些新特征,这里设计了一个类,可以以比较优雅的方式处理此类问题,类的定义如下:

#pragma once
#include <mutex>
#include <memory>
#include <thread>
#include <future>
#include <functional>
#include <QObject>
#include <QThread>
#include <QCoreApplication>


/*!
 * \brief  用于将函数放在Qt的GUI线程中调用,通常用于需要在子线程中
 * 操作UI对象的操作,可以调用普通函数、类成员函数、lambada表达式等
 * 任何形式的函数。
 * 使用前需在GUI线程调用一下GuiThreadRun::inst()后才能正常使用。
 * 使用方法如下:
 * 1. 普通函数		GuiThreadRun::excute(func,...)  //...表示函数的参数
 * 2. 类成员函数		GuiThreadRun::excute(&ClassName::func,classobj pointer,...)  
 * 
 * \author ICOODE
 * \date   2021/07/19
 */
class GuiThreadRun : public QObject {
   
	Q_OBJECT

public:
	static GuiThreadRun *inst() {
   
		static GuiThreadRun *s_this = new GuiThreadRun();
		return s_this;
	}

	/**
	 * @brief 在gui线程中执行指定函数
	 * @param f 要执行函数的指针
	 * @param args 要执行函数的参数
	 * @return 同执行函数的返回类型一致
	 */
	template<typename F, typename... Args>
	static auto excute(F &&f, Args&&... args)
		-> typename std
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值