Object::connect: Cannot queue arguments of type 'QMap<QString,QString>'(要使用qRegisterMetaType<StringMap>进行注册)

QObject::connect: Cannot queue arguments of type ‘QMap<QString,QString>‘,(Make sure ‘QMap<QString,QString>‘ is registered using qRegisterMetaType().).

上述错误,只有在跨线程信号传递时才会出现.  因为QMap是QT可识别的基本类型,不需要再注册元对象系统中,在同一个线程中运行没有问题.

源码:

Cpp代码  

  1. // 线程类 thread.h
  2. class Thread:public QThread
  3. {
  4. Q_OBJECT
  5. public:
  6. Thread(){}
  7. ~Thread(){}
  8. protected:
  9. virtual void run();
  10. signals:
  11. void sendMsg(const QMap<QString,QString> &msgs);
  12. }

Cpp代码  

  1. // 信号接收类 test.h
  2. Test(Thread *th):m_th(th)
  3. {
  4. // 不同线程用队列方式连接
  5. connect(m_th,SIGNAL(sendMsg(const QMap<QString,QString> &)),this,SLOT(handle(const QMap<QString,QString> &)),Qt::QueuedConnection);
  6. }

解决方案:通过qRegisterMetaType()方法注册至Metype中

Cpp代码  

  1. // thread.h
  2. typedef QMap<QString,QString> StringMap; // typedef操作符为QMap起一别名
  3. void sendMsg(const StringMap &);

Cpp代码  

  1. // test.h
  2. Test(Thread *th):m_th(th)
  3. {
  4. // 注册QMap至元对象系统
  5. qRegisterMetaType<StringMap>("StringMap");
  6. connect(m_th,SIGNAL(sendMsg(const StringMap &)),this,SLOT(handle(const StringMap &)),Qt::QueuedConnection);
  7. }

http://tcspecial.iteye.com/blog/1897006

Object::connect: Cannot queue arguments of type 'QMap<QString,QString>'(要使用qRegisterMetaType<StringMap>进行注册)

原文地址:https://www.cnblogs.com/findumars/p/9589328.html

时间: 2024-08-10 03:14:20

Object::connect: Cannot queue arguments of type 'QMap<QString,QString>'(要使用qRegisterMetaType<StringMap>进行注册)的相关文章

QObject::connect: Cannot queue arguments of type &quot;xxx&quot;,(Make sure &quot;xxx&quot; is registed using qRegisterMetaType().)原因及解决方法

在线程中通过信号和槽函数传递信息的时候,由于用到了自己定义的参数结构:QHash<int , pMsg>,于是在发生信号传递的时候出现了报错: QObject::connect: Cannot queue arguments of type "QHash<int , pMsg>",(Make sure "QHash<int , pMsg>" is registed using qRegisterMetaType().) 查找到原因

PyQt-QObject::connect: Cannot queue arguments...报错

[问题] 源码: class Windows(QtGui.QWidget):     # Creates a widget containing:     # - a QLineEdit (status_widget)     # - a button, connected to on_run_clicked     def on_run_clicked(self):         def update(text):             self.widget.setText(text)

Undefined function or method &#39; &#39; for input arguments of type &#39;double&#39; ---错误解决办法

你如果要使用这个guo.m作为函数进行调用的话,那需要满足以下条件: 1.在guo.m里面要写成function的格式 function [output parmaters]=guo[input parameters] 2.拥有这个function的m文件的文件名要与这个函数名称一致,意思就是文件名要为 guo.m 3.调用这个function的m文件要与guo.m处于同一工作目录下 4.输入输出参数类型要与函数内部要求的类型一致 Undefined function or method ' '

详解 Qt 线程间共享数据(使用signal/slot传递数据,线程间传递信号会立刻返回,但也可通过connect改变)

使用共享内存.即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的. Qt 线程间共享数据是本文介绍的内容,多的不说,先来啃内容.Qt线程间共享数据主要有两种方式: 使用共享内存.即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的: 使用singal/slot机制,把数据从一个线程传递到另外一个线程. 第一种办法在各个编程语言都使用普遍,而第二种方式倒是QT的特有方式,下面主要学习一

浅析 Qt 元类型(MetaType)注册

本文介绍的是 Qt 元类型(MetaType)注册,请先来看内容. QObject::connect: Cannot queue arguments of type 'ERROR_LEVEL' (Make sure 'ERROR_LEVEL' is registered using qRegisterMetaType().) 其中ERROR_LEVEL只是我定义的枚举类型即enum ERROR_LEVEL.然后在Qt的信号-槽函数的参数中使用了这个枚举型,在发送信号时就出现了上述警告.上面警告的

Qt元对象系统源码解析

Qt元对象系统源码解析 https://blog.51cto.com/9291927/2070348 一.Qt元对象系统简介 1.元对象系统简介 Qt 的信号槽和属性系统基于在运行时进行内省的能力,所谓内省是指面向对象语言的一种在运行期间查询对象信息的能力, 比如如果语言具有运行期间检查对象型别的能力,那么是型别内省(type intropection)的,型别内省可以用来实施多态.C++的内省比较有限,仅支持型别内省, C++的型别内省是通过运行时类型识别(RTTI)(Run-Time Typ

QT子线程与主线程的信号槽通信

最近用QT做一个服务器,众所周知,QT的主线程必须保持畅通,才能刷新UI.所以,网络通信端采用新开线程的方式.在涉及到使用子线程更新Ui上的控件时遇到了点儿麻烦.网上提供了很多同一线程不同类间采用信号槽通信的方式,但是并不完全适合线程间的信号槽通信,这主要体现在自定义消息的传递上. 首先我们看看一般的方式: testthread.h 文件 #ifndef TESTTHREAD_H #define TESTTHREAD_H #include <QThread> #include "ms

详解 Qt 线程间共享数据(用信号槽方式)

使用共享内存.即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的. Qt 线程间共享数据是本文介绍的内容,多的不说,先来啃内容.Qt线程间共享数据主要有两种方式: 使用共享内存.即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的: 使用singal/slot机制,把数据从一个线程传递到另外一个线程. 第一种办法在各个编程语言都使用普遍,而第二种方式倒是QT的特有方式,下面主要学习一

QTcpSocket使用过程中的一些问题记录

目前,在将原来C的socket通讯改为使用Qt类库QTcpSocket通讯,在修改过程中遇到不少问题,在此将问题一并记录,以备后面使用. 采用的通讯方式:QTimer定时器.QThread多线程和QTcpSocket通讯.QTimer设置定时通讯间隔(10s),QThread运行定时器响应函数,QTcpSocket进行数据发送. 1.问题一:QTcpSocket对象创建和使用要在同一个线程,否则报错. 错误描述:QObject:Cannot create children for a paren