widgetObject有操函数Test:

void Test(int *v);

在线程中调用Test,会被忽略,实际不会调用。

QMetaObject::invokeMethod(widgetObject, "Test", Qt::QueuedConnection, Q_ARG(int*,&v));

下面是网上找的理由:

1.在同一个线程中
当信号和槽都在同一个线程中时,值传递参数和引用传递参数有区别: 值传递会复制对象;(测试时,打印传递前后的地址不同) 引用传递不会复制对象;(测试时,打印传递前后的地址相同)

不在同一个线程中
当信号和槽不在同一个线程中时,分两种情况。 1、connect时使用AutoConnection(跨线程默认是QueuedConnection):值传递参数和引用传递参数没有区别,都会复制对象;(测试时,打印传递前后的地址不同) 2、connect时使用DirectConnection,测试结果和在同一线程中的结果相同。

2.emit发射信号 在信号中以&引用作为参数
以引用作为参数一定要注意,在第二次发射信号的时候,引用的实体已经不存在了。

所以,如果想让每一次发射的信号中参数的值都保存下来,不能是&引用和*指针作为参数,而应该使用值传递。

这样每次发射信号的值都能够保存下来。

3.当我们传递一些自定义类型,比如类和结构体的时候,传递可能会出错,自己亲身体会,看到自己的信号槽已经关联了但是信号发出之后根本不会进入槽函数,因为这个信号槽是无效的,因为你自己定义的类型没有注册的话,信号槽机制将无法识别,解决办法就是进行如下操作进行注册

方法一:先把指针封装到struct中,在使用qRegisterMetaType注册struct类型,来传递

方法二:懒人办法,把指针转地址换为long long,通过long long参数传递

Qt 在线程中invokeMethod采用QueuedConnection模式,调用带指针参数槽,实际不会调用的更多相关文章

  1. Vue-cli3.x在开发环境中(router采用 history模式)出现Failed to resolve async component default: Error: Loading chunk {/d} failed.或者Uncaught SyntaxError: Unexpected token <错误

    使用Vue-cli3.x开发环境中(router采用 history模式)出现Failed to resolve async component default: Error: Loading chu ...

  2. python 调用dll中c或c++语言的带指针方法,

    在项目开发中遇到了,python需要去调用一个动态链接库dll中的c++方法.这个方法的参数为一个指针类型的参数,一个bool类型参数, 在python中并未对数字类型进行区分. int LP_Agc ...

  3. Qt多线程编程中的对象线程与函数执行线程

    近来用Qt编写一段多线程的TcpSocket通信程序,被其中Qt中报的几个warning搞晕了,一会儿是说“Cannot create children for a parent that is in ...

  4. Qt跨线程信号和槽的连接(默认方式是直连和队列的折中)

    Qt支持三种类型的信号-槽连接:1,直接连接,当signal发射时,slot立即调用.此slot在发射signal的那个线程中被执行(不一定是接收对象生存的那个线程)2,队列连接,当控制权回到对象属于 ...

  5. 重点:怎样正确的使用QThread类(很多详细例子的对比,注意:QThread 中所有实现的函数是被创建它的线程来调用的,不是在线程中)good

    背景描述: 以前,继承 QThread 重新实现 run() 函数是使用 QThread唯一推荐的使用方法.这是相当直观和易于使用的.但是在工作线程中使用槽机制和Qt事件循环时,一些用户使用错了.Qt ...

  6. 关于Qt在子线程中使用QMessageBox的折衷方法

    Qt将所有GUI相关的处理都限制在主线程中,这么做有助于防止意想不到的访问冲突产生,但也限制了线程中某些简单的UI交互的实现,比如QMessageBox. 因为QMessageBox必须在主线程中打开 ...

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

    Qt 信号和槽连接方式 常量 描述 Qt::AutoConnection (默认)如果接收方位于发出信号的线程中,则使用Qt::DirectConnection.否则,使用Qt::QueuedConn ...

  8. 【转】Struts2的线程安全 和Struts2中的设计模式----ThreadLocal模式

    [转]Struts2的线程安全 和Struts2中的设计模式----ThreadLocal模式 博客分类: 企业应用面临的问题 java并发编程 Struts2的线程安全ThreadLocal模式St ...

  9. 独立线程中实现QT GUI

    在网上搜集的资料: http://www.qtcentre.org/threads/16552-Starting-QT-GUI-in-a-seperate-Threadhttp://stackover ...

  10. qt数据库多线程问题的解决(QSqlDatabase只能在创建它的线程中使用)

    Qt数据库由QSqlDatabase::addDatabase()生成的QSqlDatabase只能在创建它的线程中使用, 在多线程中共用连接或者在另外一个线程中创建query都是不支持的几乎国内没有 ...

随机推荐

  1. GPUStack正式发布: 为大模型而生的开源GPU集群管理器

    经过 Seal 研发团队几个月来持续的开发和测试,我们满怀期待及热情地发布新的产品 GPUStack,GPUStack 是一个用于运行 LLM(大型语言模型)的开源 GPU 集群管理器.尽管如今大语言 ...

  2. CSS 学习路线图

    一.基础入门阶段 学习内容: 理解 CSS 的作用和基本概念,包括样式表如何与 HTML 结合来美化网页. 掌握 CSS 的语法结构,如选择器.属性和值的组合方式. 学习常见的文本样式属性,如字体大小 ...

  3. OPENLDAP部署完整版(Linux)附一键式脚本

    (一)环境信息1,系统环境2,域信息(本章节使用)(二)应用部署1,ladp部署1. yum方式安装OpenLDAP服务2.拷贝数据库配置配置文件,并启动服务3.slappasswd生成OpenLDA ...

  4. LeetCode 1000. Minimum Cost to Merge Stones (区间 DP)

    根据寒神题解 https://leetcode.com/problems/minimum-cost-to-merge-stones/discuss/247567/JavaC%2B%2BPython-D ...

  5. ABC270-d

    题目 首先贪心是行不通的,考试的时候打了贪心,挂了...... 举个反例: 10 2 3 4 贪心枚举答案为4,但若高桥先选3,最大值为6. 其实考试的时候想到了dp,但是不会打 悲 因为青木也是聪明 ...

  6. docker部署Prometheus与Grafana

    prometheus部署 建立文件 mkdir -p /ops/prometheus-data && cd /ops/prometheus-data vi /ops/prometheu ...

  7. 使用 Prometheus 在 KubeSphere 上监控 KubeEdge 边缘节点(Jetson) CPU、GPU 状态

    作者:朱亚光,之江实验室工程师,云原生/开源爱好者. KubeSphere 边缘节点的可观测性 在边缘计算场景下,KubeSphere 基于 KubeEdge 实现应用与工作负载在云端与边缘节点的统一 ...

  8. Windows 如何启用 Administrator 账户

    Windows 默认安装的时候需要自己定义一个账户,不是管理员账户,不能操作某些目录,有时很不方便.不过我们可以手动打开,像盗版一样默认使用 Administrator  账户: 按下Win + R, ...

  9. Windows 使用 Mingw-w64 配置GCC套件

    Mingw-w64里的gcc和g++应该是很多人常用的编译工具.但是他的下载资源很乱,不好找(注意:MinGW和MinGW-w64是同宗同源的两款软件!),要么就是版本太老.SourceForge上有 ...

  10. Java面试题中高级进阶(JVM篇Java垃圾回收)

    前言 本来想着给自己放松一下,刷刷博客,突然被几道面试题难倒!说说Java对象创建过程?知道类的生命周期吗?简述Java的对象结构?如何判断对象可以被回收?JVM的永久代中会发生垃圾回收么?你知道哪些 ...