我用 Qt/C++ 开发了一个应用程序,该应用程序目前在一个线程中运行,并且基于 UI 和框架。 UI 和框架使用 Qt 提供的信号/槽机制一起讨论。我添加了线程,因为框架内的某些操作卡住了 UI。
我面临的问题是,由于
QObject::connect: Cannot queue arguments of type 'uint32_t'
(Make sure 'uint32_t' is registered using qRegisterMetaType().)
我所做的是,主要声明 qRegisterMetatype 但它仍然在提示。我真的不知道我还必须做什么。
例如,我在下面为您提供了删除的基本过程。
主要.cpp
qRegisterMetaType<uint32_t>("uint32_t");
qRegisterMetaType<QList<QTreeWidgetItem*> >("QList<QTreeWidgetItem*>");
树部件.cpp
void TreeWidget::DeleteAction() {
....
connect(this,&PulsTreeWidget::RequestDelete, &m_Framework, &PulsFramework::DeleteItem);
emit RequestDelete(item, nb_items);
}
框架.cpp
void Framework::DeleteItem(QList<QTreeWidgetItem *> item, uint32_t total_item) {...}
有什么想法吗?我是否不需要按原样使用 uint32_t 但更改它的定义
谢谢
最佳答案
你正在做一些糟糕的事情。我的例子:
对象.h
#ifndef OBJECT_H
#define OBJECT_H
#include <QtCore>
class Object : public QObject
{
Q_OBJECT
public:
explicit Object(QObject *parent = 0);
void emitSignal(uint32_t v);
public slots:
void mySlot(uint32_t v);
signals:
void mySignal(uint32_t v);
};
#endif // OBJECT_H
对象.cpp
#include "Object.h"
Object::Object(QObject *parent) :
QObject(parent)
{
}
void Object::emitSignal(uint32_t v)
{
emit mySignal(v);
}
void Object::mySlot(uint32_t v)
{
qDebug() << v;
}
main.cpp
#include "Object.h"
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
qRegisterMetaType < uint32_t >("uint32_t"); // <--------------
Object o1, o2;
QThread t1, t2;
o1.moveToThread(&t1);
o2.moveToThread(&t2);
QObject::connect(&o1, SIGNAL(mySignal(uint32_t)), &o2, SLOT(mySlot(uint32_t)));
QObject::connect(&o2, SIGNAL(mySignal(uint32_t)), &o1, SLOT(mySlot(uint32_t)));
t1.start();
t2.start();
o1.emitSignal(5);
o2.emitSignal(10);
return app.exec();
}
输出:
5
10
删除时 qRegisterMetaType < uint32_t >("uint32_t");
线,也提示:
QObject::connect: Cannot queue arguments of type 'uint32_t'
(Make sure 'uint32_t' is registered using qRegisterMetaType().)
QObject::connect: Cannot queue arguments of type 'uint32_t'
(Make sure 'uint32_t' is registered using qRegisterMetaType().)
P.S.:我不喜欢你的连接+发射对。你知道吗,你只需要将信号连接到插槽一次就可以工作了?您不需要在每个信号发出之前都这样做。
关于c++ - 线程和 QRegisterMetatype 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30629453/