解决:QObject::connect queue arguments of type ‘xxxx’,Make sure ‘xxxx’ is registered using qRegister

博客介绍了在Qt中解决connect函数提示错误的方法,即调用connect前通过qRegisterMetaType()注册对象类型。还扩展说明了Qt meta - object system,指出自定义类型对象使用该系统功能需先注册,介绍了Q_DECLARE_METATYPE()和qRegisterMetaType()两种注册方式。

解决方法:在调用connect之前,通过 qRegisterMetaType() 注册你connect函数里对象的类型代码如下:
typedef QString CustomString;//你自己定义的类型
qRegisterMetaType<CustomString>(“CustomString”);//注册你自己的类型
connect(…)//之后connect就不再出现该提示错误
扩展:
Qt meta-object system包含对象间相互通信(信号和槽),运行类型信息和动态属性系统。自定义类型class的对象想要用到这些系统里的功能,例如信号和槽的connect,就必须先在meta-system里注册自定义类型。QMetaType类管理了meta-object system里命名的类型,帮助管理QVariant,以及信号和槽的连接。注册的方式有两种:
1.Q_DECLARE_METATYPE() 利用其声明新类型,使新类型可以在QVariant和其他的模板基类函数可用;
2.qRegisterMetaType()调用其函数可使得新类型在非模板基类函数可用,队列式的信号和槽的连接。

在使用 Qt 的信号与槽机制时,若涉及跨线程传递参数(如 `UINT` 类型),可能会遇到类似以下错误提示: ``` QObject::connect: Cannot queue arguments of type 'UINT' (Make sure 'UINT' is registered using qRegisterMetaType().) ``` 该问题的根源在于 Qt 无法自动识别某些非 Qt 内建类型(例如 Windows 定义的 `UINT`)用于跨线程的元对象系统通信。为解决此问题,需要通过 `qRegisterMetaType` 函数将相关类型注册到 Qt 的元类型系统中。 ### 注册 `UINT` 类型 尽管 `UINT` 是 Windows 平台下的基本数据类型,在 Qt 中并不默认支持作为可队列化的参数类型。因此,需手动注册该类型。注册方式如下: ```cpp #include <QMetaType> // 在程序初始化阶段调用,例如在 main 函数或构造函数中 qRegisterMetaType<UINT>("UINT"); ``` 上述代码确保了 `UINT` 类型能够被 Qt 的元对象系统识别,并允许其在跨线程信号槽连接中安全传递[^1]。 ### 跨线程连接示例 假设存在一个工作线程类 `Worker`,它发出携带 `UINT` 参数的信号: ```cpp class Worker : public QObject { Q_OBJECT public slots: void doWork() { UINT value = 12345; emit resultReady(value); } signals: void resultReady(UINT result); }; ``` 主线程中的接收对象需正确连接该信号,并确保类型已注册: ```cpp Worker* worker = new Worker(); worker->moveToThread(&workerThread); // 确保类型注册 qRegisterMetaType<UINT>("UINT"); connect(&workerThread, &QThread::started, worker, &Worker::doWork); connect(worker, &Worker::resultReady, this, &MainWindow::handleResult); workerThread.start(); ``` ### 注意事项 - **注册时机**:应在建立连接之前完成类型的注册操作。 - **线程安全性**:`qRegisterMetaType` 是线程安全的,可在任意线程中调用。 - **重复注册**:多次注册同一类型不会造成错误,但建议避免不必要的重复调用。 ### 类似问题扩展 若传递的是更复杂的数据结构(如 `QVector<int>`、自定义结构体等),也应采用相同的方式进行注册。例如: ```cpp struct MyStruct { int id; QString name; }; Q_DECLARE_METATYPE(MyStruct) // 注册结构体 qRegisterMetaType<MyStruct>("MyStruct"); ``` 如此便可支持该结构体在跨线程信号槽中的传递[^4]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值