QRunnable与外界互传对象

2023-09-22 15:00:18

1.概述

QRunnable与外界互通讯是有两种方法的

  • 使用多继承。让我们的自定义线程类同时继承于QRunnable和QObject,这样就可以使用信号和槽,但是多线程使用比较麻烦,特别是继承于自定义的类时,容易出现接口混乱,所以在项目中尽量少用多继承。
//使用多继承
class runnable : public QObject,  public QRunnable
{
    Q_OBJECT
public:
    explicit runnable (QObject *parent = nullptr)
    {
        setAutoDelete(true);
    }
    void run() override{
    	emit sig_finish();
    }
signals:
    void sig_finish();
};
  • 使用QMetaObject::invokeMethod

2.QMetaObject::invokeMethod的介绍

  • QMetaObject::invokeMethod()的创建方法 :
QMetaObject::invokeMethod(QObject *obj, //使用的类const char
 *member, //调用函数名Qt::ConnectionType type,//调用类型
 QGenericReturnArgument ret,//用来存储返回值的类型
 QGenericArgument val0 = QGenericArgument(nullptr),
 QGenericArgument val1 = QGenericArgument(), QGenericArgument val2 = QGenericArgument(), QGenericArgument val3 = QGenericArgument(),QGenericArgument val4 = QGenericArgument(),QGenericArgument val5 = QGenericArgument(),QGenericArgument val6 = QGenericArgument(), QGenericArgument val7 = QGenericArgument(), QGenericArgument val8 = QGenericArgument(),QGenericArgument val9 = QGenericArgument())//最多有10个参数

*obj:需要把使用类传进去
member:函数的名称
type:调用类型:

Qt::DirectConnnect 立即调用该成员函数
Qt::QueuedConnection 一旦应用程序进入主事件循环,就会发送QEvent 并调用成员。
Qt::BlockQueuedConnection当前线程将阻塞,直到事件被传递。使用此连接类型在同一线程中的对象之间进行通信将导致死锁。
Qt::AutoConnection 如果 obj与调用方位于同一线程中,则同步调用成员;否则,它将异步调用该成员。
val0-val9:最多可以有10个参数

传参的方式:使用宏传参

Q_ARG(type,const Type&value)
Q_RETURN_ARG(type, Type&value)

3.QMetaObject::invokeMethod的使用

实现QRunnable与外界互传对象

  • 假如我们在主界面中定一个函数Update_Result,用于接收QRunnable::run()发送来的值,并且返回结果给QRunnable::run()。
//继承QRunnable
class runnable : public QRunnable
{
public:
    explicit runnable(QObject *obj):obj(obj)
    {
        setAutoDelete(true);
    }
    void run() override{
        int value = 123;
        QString ret = "";//接收主线程函数的返回值
        QMetaObject::invokeMethod(obj, "Update_Result", Qt::BlockingQueuedConnection,//当前线程将阻塞,直到事件被传递。使用此连接类型在同一线程中的对象之间进行通信将导致死锁。
                                      Q_RETURN_ARG( QString, ret),//返回
                                      Q_ARG(int,value));//传参

         qDebug()<<"run返回值:"<<ret;
    }
    
    QObject *obj;
};
class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

	//Q_INVOKABLE 用于更新界面内容的作用是用来修饰成员函数,让被修饰的成员函数能够被元对象系统所唤起
    Q_INVOKABLE  QString Update_Result(int value){
      QString  ret =  QString("abc%1").arg(value);
      qDebug()<<"Update_Result:"<<ret;
       return ret;
    }
	
private slots:
     void on_pushButton_clicked(){
        IAPrunnable  *runnable= new IAPrunnable(this);
        QThreadPool::globalInstance()->start(runnable);
    }
 }

运行结果:

Update_Result: “abc123”
run返回值: “abc123”

更多推荐

Hoeffing不等式

在李航老师的统计学习方法(第一版中)Hoeffing不等式Hoeffing不等式Hoeffing不等式是这样子给出的设X1,X2,...,XNX_1,X_2,...,X_NX1​,X2​,...,XN​是独立随机变量,且Xi∈[ai,bi],i=1,2,...,N;SN=∑i=1NXiX_i\in[a_i,b_i],i

VMware Fusion 13在M2芯片的Mac上安装 Windows 11

首先需要下载Windows11镜像以下给出一种官方方法,当然也可以自己去网上搜索,有很多资源注册微软账号使用注册的账号登录访问:https://www.microsoft.com/en-us/windowsinsider/register使用登录的账号注册Windows11InsiderProgram看到以下页面,就是

【2023华为杯A题】WLAN网络信道接入机制建模(代码、思路.....)

💥💥💞💞欢迎来到本博客❤️❤️💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。⛳️座右铭:行百里者,半于九十。📋📋📋本文目录如下:🎁🎁🎁目录💥1背景1.1分布式信道接入和二进制指数退避1.2基于Markovchain的DCF机制建模和系统性能分析📚2WLAN组

Apache shenyu,Java 微服务网关的首选

微服务网关的产生背景当我们系统复杂度越来越高,团队协作效率越来越低时,我们通常会想到通过"拆分"来应对,这是典型的"化繁为简,分而治之"的思想。在落地过程中,我们通常会引入"SOA"或者"微服务"架构手段,如下图所示:技术更新日新月异,站在当下去看,“微服务”、“API网关”、“云原生”、“servicemesh”…这

CFCA证书 申请 流程(一)

CFCA证书CFCA证书是指由中国金融认证中心颁发的证书,包括普通数字证书、服务器数字证书和预植证书等,目前,各大银行和金融机构都会使用CFCA颁发的证书作为官网的HTTPS证书、手机银行等APP使用的证书以及USB-KEY(U盾)内置的证书。在案例中包括中国工商银行、中国民生银行、中国光大银行、中信银行、兴业银行、中

NSS [西湖论剑 2022]real_ez_node

NSS[西湖论剑2022]real_ez_node考点:ejs原型链污染、NodeJS中Unicode字符损坏导致的HTTP拆分攻击。开题。附件start.sh。flag位置在根目录下/flag.txtapp.js(这个没多大用)varcreateError=require('http-errors');varexpr

企业微信-通用开发参数回调设置

公司业务需要开发企业微信,注册三方服务商审核通过后,开始配置开发信息。本篇中记录在调试url验证中遇到错误及解决方式。目录准备工作下载php加解密库下载文件说明设置白名单设置路径参数说明设置ip回调处理回调类型:1、Get类型2、Post类型Get回调实现设置路由控制器业务层处理配置开发信息遇到问题发现问题解决方案准备

学习路之工具--SecureCRT的下载、安装

百度盘:链接:https://pan.baidu.com/s/1r3HjEj053cKys54DTqLM4A?pwd=gcac提取码:gcac复制这段内容后打开百度网盘手机App,操作更方便哦感谢大佬简单介绍下SecureCRTSecureCRT是一款支持SSH(SSH1和SSH2)的终端仿真程序,简单地说是Windo

小米云原生文件存储平台化实践:支撑 AI 训练、大模型、容器平台多项业务

小米作为全球知名的科技巨头公司,已经在数百款产品中广泛应用了AI技术,这些产品包括手机、电视、智能音箱、儿童手表和翻译机等。这些AI应用主要都是通过小米的深度学习训练平台完成的。在训练平台的存储方案中,小米曾尝试了多种不同的存储方式,包括Ceph+NFS、HDFS和对象存储挂载等。然而,这些不同的存储方式导致了数据冗余

SpringCloud Gateway搭建Gateway 微服务应用实例

😀前言本篇博文是关于SpringCloudGateway搭建Gateway微服务应用实例,希望你能够喜欢🏠个人主页:晨犀主页🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力😉😉💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,感谢大家的观看🥰如果文章有什么需要改进

Linux系统命令——通过端口确认进程及路径方法

一、端口概念在网络技术中,端口(port)大致有两种意思:一是物理意义上的端口比如,ADSLModem、集线器、交换机、路由器用于连接其他网络设备的接口,如RJ-45端口、SC端口等等。二是逻辑意义上的端口,一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的

热文推荐