添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

出现问题:

Qt代码写好,在编译时候出现如下的问题:

QObject::connect: Cannot queue arguments of type 'QList<quint16>'
(Make sure 'QList<quint16>' is registered using qRegisterMetaType().)

QList<quint16> 类型没有被注册,只需要注册一下就解决了。

解决方法:

在报错信息中找到报错的是哪一行,在之前加上下面这段代码,进行注册即可,再次编译就不会出现类似的问题了。

qRegisterMetaType<QList<quint16>>("QList<quint16>");

QList<quint16> 这个类型是本人代码开发中遇到的,没有注册的类型,你们在开发过程中,报错的是什么类型,就将这个替换掉即可。

2 错误描述 在不同线程之间通过信号/槽来传递自定义数据类型QList的时候,提示错误: QObject :: connect : Cannot queue arguments of type 'QList' (Make sure 'QList' is registered using qRegist 最近刚开始学py qt 5,搜索后才知道只能在UI线程里绘制界面,不能在子线程里绘制- -,遇到了坑,记录下这个过程 代码是创建子线程调用fun_1,fun_1会修改list,等线程执行完后再将list里的元素添加到TableWidget里 list=[...] def fun_1(i): #change list class fun2Thread( Qt Core.Q... 用c++/ qt 写的项目,项目都经测试过,真实可靠,可供自己学习c++/ qt Qt 是一个用标准C++编写的跨平台开发类库,它对标准C++进行了扩展,引入了元对象系统、信号与槽、属性等特性,使应用程序的开发变得更高效。 Qt 类库中大量的类以模块形式分类组织的,包括基本模块和扩展模块等。一个模块通常就是一个编程主题,如数据库、图表、网络等。 一、 Qt 核心特点 1.1.概述 Qt 本身并不是一种编程语言,它本质上是一个跨平台的C++开发类库,是用标准C++编写的类库,它为开发GUI应用程序和非GUI应用程序提供了各种类。 Qt 对标准C++进行了扩展,引入了一些新概念和功能,例如信号和槽、对象属性等。 Qt 的元对象 编译 器(Meta-Object Compiler,MOC)是一个预处理器,在源程序被 编译 前先将这些 Qt 特性的程序转换为标准C++兼容的形式,然后再由标准C++ 编译 器进行 编译 。这就是为什么在使用信号与槽机制的类里,必须添加一个Q_OBJECT宏的原因,只有添加了这个宏,moc才能对类里的信号与槽的代码进行预处理。 Qt Core模块是 Qt 类库的核心,所有其他模块都依赖于此模块,如果使用qmake来构建项目, Qt Core模块则是被自动加入的。 Qt 为C++语言增加的特性就是在 Qt Core模块里实现的,这些扩展特性由 Qt 的元对象系统实现,包括信号与槽机制、属性系统、动态类型转换等。 1.2.元对象系统 Qt 的元对象系统(Meta-Object-System)提供了对象之间通信的信号与槽机制、运行时类型信息和动态属性系统。 元对象系统由以下三个基础组成: 1. QObject 类是所有使用元对象系统的类的基类; 2.在一个类的private部分声明Q_OBJECT宏,使得类可以使用元对象的特性,如动态属性、信号与槽。 3.MOC(元对象 编译 器)为每个 QObject 的子类提供必要的代码来实现元对象系统的特征。 构建项目时,MOC工具读取C++源文件,当它发现类的定义里有Q_OBJECT宏时,它就会为这个类生成另外一个包含有元对象支持代码的C++源文件,这个生成的源文件连同类的实现文件一起被 编译 和连接。 除了信号和槽机制外,元对象还提供如下一些功能。 1. QObject ::metaObject()函数返回类关联的元对象,元对象类QMetaObject包含了访问元对象的一些接口函数,例如QMetaObject::className()函数可在运行时返回类的名称字符串。 QObject obj=new QPushButton; obj->metaObject()->className(); 2.QMetaObject::newInstance()函数创建类的一个新的实例。 3. QObject ::inherits(const charclassName)函数判断一个对象实例是否是名称为className的类或 QObject 的子类的实例。 1.3.属性系统 1.属性定义 Qt 提供一个Q_PROPERTY()宏可以定义属性,它也是属于元对象系统实现的。 Qt 的属性系统与C++ 编译 器无关,可以用任何标准的C++ 编译 编译 定义了属性的 Qt C++程序。 2.属性的使用 不管是否用READ和WRITE定义了接口函数,只要知道属性名称,就可以通过 QObject ::property()读取属性值,并通过 QObject ::setProperty()设置属性值。 3.动态属性 QObject ::setProperty()函数可以在运行时为类定义一个新的属性,称之为动态属性。动态属性是针对类的实例定义的。 动态属性可以使用 QObject ::property()查询,就如在类定义里用Q_PROPERTY宏定义的属性一样。 例如,在数据表编辑界面上,一些字段是必填字段,就可以在初始化界面时为这些字段的关联显示组件定义一个新的required属性,并设置值为“true"。 4.类的附加信息 属性系统还有一个宏Q_CLASSINFO(),可以为类的元对象定义”名称——值“信息。 用c++/ qt 写的项目,项目都经测试过,真实可靠,可供自己学习c++/ qt Qt 是一个用标准C++编写的跨平台开发类库,它对标准C++进行了扩展,引入了元对象系统、信号与槽、属性等特性,使应用程序的开发变得更高效。 Qt 类库中大量的类以模块形式分类组织的,包括基本模块和扩展模块等。一个模块通常就是一个编程主题,如数据库、图表、网络等。 一、 Qt 核心特点 1.1.概述 Qt 本身并不是一种编程语言,它本质上是一个跨平台的C++开发类库,是用标准C++编写的类库,它为开发GUI应用程序和非GUI应用程序提供了各种类。 Qt 对标准C++进行了扩展,引入了一些新概念和功能,例如信号和槽、对象属性等。 Qt 的元对象 编译 器(Meta-Object Compiler,MOC)是一个预处理器,在源程序被 编译 前先将这些 Qt 特性的程序转换为标准C++兼容的形式,然后再由标准C++ 编译 器进行 编译 。这就是为什么在使用信号与槽机制的类里,必须添加一个Q_OBJECT宏的原因,只有添加了这个宏,moc才能对类里的信号与槽的代码进行预处理。 Qt Core模块是 Qt 类库的核心,所有其他模块都依赖于此模块,如果使用qmake来构建项目, Qt Core模块则是被自动加入的。 Qt 为C++语言增加的特性就是在 Qt Core模块里实现的,这些扩展特性由 Qt 的元对象系统实现,包括信号与槽机制、属性系统、动态类型转换等。 1.2.元对象系统 Qt 的元对象系统(Meta-Object-System)提供了对象之间通信的信号与槽机制、运行时类型信息和动态属性系统。 元对象系统由以下三个基础组成: 1. QObject 类是所有使用元对象系统的类的基类; 2.在一个类的private部分声明Q_OBJECT宏,使得类可以使用元对象的特性,如动态属性、信号与槽。 3.MOC(元对象 编译 器)为每个 QObject 的子类提供必要的代码来实现元对象系统的特征。 构建项目时,MOC工具读取C++源文件,当它发现类的定义里有Q_OBJECT宏时,它就会为这个类生成另外一个包含有元对象支持代码的C++源文件,这个生成的源文件连同类的实现文件一起被 编译 和连接。 除了信号和槽机制外,元对象还提供如下一些功能。 1. QObject ::metaObject()函数返回类关联的元对象,元对象类QMetaObject包含了访问元对象的一些接口函数,例如QMetaObject::className()函数可在运行时返回类的名称字符串。 QObject obj=new QPushButton; obj->metaObject()->className(); 2.QMetaObject::newInstance()函数创建类的一个新的实例。 3. QObject ::inherits(const charclassName)函数判断一个对象实例是否是名称为className的类或 QObject 的子类的实例。 1.3.属性系统 1.属性定义 Qt 提供一个Q_PROPERTY()宏可以定义属性,它也是属于元对象系统实现的。 Qt 的属性系统与C++ 编译 器无关,可以用任何标准的C++ 编译 编译 定义了属性的 Qt C++程序。 2.属性的使用 不管是否用READ和WRITE定义了接口函数,只要知道属性名称,就可以通过 QObject ::property()读取属性值,并通过 QObject ::setProperty()设置属性值。 3.动态属性 QObject ::setProperty()函数可以在运行时为类定义一个新的属性,称之为动态属性。动态属性是针对类的实例定义的。 动态属性可以使用 QObject ::property()查询,就如在类定义里用Q_PROPERTY宏定义的属性一样。 例如,在数据表编辑界面上,一些字段是必填字段,就可以在初始化界面时为这些字段的关联显示组件定义一个新的required属性,并设置值为“true"。 4.类的附加信息 属性系统还有一个宏Q_CLASSINFO(),可以为类的元对象定义”名称——值“信息。 在跨线程的信号和槽的参数传递中, 参数的类型是自定义的类型, 然而此时 出现 了错误: QObject :: connect : Cannot queue arguments of type 'Pos' (Make sure 'Pos' is registered using qRegisterMeta Type ().) 其中, Pos是自定义的类型: struct Pos { int x... 今天线程传值中传容器发现子线程给主线程发信号的时候报错了, 出现 QObject :: connect : Cannot queue arguments of type '******',该信息通过注册类型来 解决 容器传输报错的问题。 本文作者原创,转载请附上文章出处与本文链接。 QObject :: connect : Cannot queue arguments of type 'QList<quint16>' (Make sure 'QList<quint16>' is registered using qRegisterMeta Type ().) 这个是由于,在主线程中开启另一个线程,这两个线程之间需要进行信息的交互。但是QList<quint16>l类型没有被注册,只要你注册一下就 解决 了。 解决 方法 : Libqmhd Libqmhd是一个 Qt 包装的 。 它在后台线程中处理请求,然后您可以通过连接到QMHDServer::newRequest()信号来处理请求。 Libqmhd还附带了一个路由器,可以轻松地将请求路由到您的代码。 您可以通过两种方式使用它。 一种是通过将路由连接到 QObject 的插槽,在这种情况下,请求将在接收者的线程中执行。 另一种 方法 是将路由连接到自定义QMHDController对象,在这种情况下,请求将在路由器线程池的一个线程中执行。 libqmhd的最简单用法是创建一个QMHDServer然后连接到newRequest()信号: QMHDServer* server = new QMHDServer(); connect (server, &QMHDServer::newRequest, server, [=](QMHDRequest* request) Qt 开发中,在尝试触发某个信号时程序崩溃, 发现报错提示 QObject :: connect : Cannot queue arguments of type 'xxx'(Make sure 'xxx' is registered using qRegisterMeta Type ().)。 出现 问题背景:当一个带参数为自定义结构体PortConfig的信号发送至另一个线程的槽时, connect (this,SIGNAL(SignalOpenPort(PortConfig)),m_pMySerialPortCom,SLOT(OpenPort(PortConfig))); 编译 时不会出错,但信号出发时 出现 错误提示: QObject :: connect : Cannot queue ar... 注意,不是在定义类型,或者定义结构体的地方进行注册,而是在所需要用到的类的构造函数中进行注册,比如我的一个自定义类,需要用到自定义的结构体做信号参数,就在他的构造函数中注册一下。在 qt 日常使用中,信号与槽机制是绝对不可或缺且常用的,其中的参数一般都会比较简单,bool、int、QString之类的,但当我们想要传递相对比较复杂的参数,例如。原因大概就是信号槽的参数不支持你自定义的类型,只能识别 QT 库中最基本的类型参数,所以需要对自定义类型进行注册。注册完就不会报错,能够正常使用了。