出现问题:
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
库中最基本的类型参数,所以需要对自定义类型进行注册。注册完就不会报错,能够正常使用了。