线程和QRegisterMetatype问题

时间:2015-06-03 19:56:17

标签: 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,但它仍然抱怨。我真的不知道我还要做什么。

我已经在下面给出了删除的基本过程。

的main.cpp

qRegisterMetaType<uint32_t>("uint32_t");
qRegisterMetaType<QList<QTreeWidgetItem*> >("QList<QTreeWidgetItem*>");

Treewidget.cpp

void TreeWidget::DeleteAction() {
    ....
    connect(this,&PulsTreeWidget::RequestDelete, &m_Framework, &PulsFramework::DeleteItem);
    emit RequestDelete(item, nb_items);
}

Framework.cpp

void Framework::DeleteItem(QList<QTreeWidgetItem *> item, uint32_t total_item) {...}

有什么想法吗?我是否需要不使用uint32_t,而是更改它的定义

由于

1 个答案:

答案 0 :(得分:0)

你正在做一些事情。我的例子:

<强> Object.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

<强> Object.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。:我不喜欢你的连接+发射对。你知道,你需要只将信号连接到插槽一次才能工作吗?在每个信号发出之前,您不需要这样做。