c++ - 线程和 QRegisterMetatype 问题

标签 c++ multithreading qt

我用 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/

相关文章:

c++ - 在 C++ 中 self 删除一个对象

c++ - 有什么理由为返回 void 的函数声明 constexpr?

c++ - 如何找到二维数组所有列的最佳匹配?

java - 任何计算机(多核或单核)都可以同时运行多个线程吗

c# - 在给定时间后等待并终止线程而不阻塞.NET 3.5

c++ - Qt如何通过QPrinter打印QFile?

c++ - 在 C++ 中设置本地环境变量

multithreading - 如何在 future 中包装 Web Worker 响应消息?

python - Qt5 涂鸦与图层 - QPaintDevice : cannot destroy device that is being painted

c++ - C++中移动数组的函数