3

我想在 Qt 的一个类中声明我自己的枚举并将其用于信号和插槽,但我收到了这个错误。

QObject::connect: Cannot queue arguments of type 'ClassA::MyEnum'
(Make sure 'ClassA::MyEnum' is registered using qRegisterMetaType().)

这是我的源代码:

类A.h

public:
    enum MyEnum {
        READING = 0,
        STOPPED = 1,
        FINISHED = 2
    };

signals:
    void changed(QString text, int readTextInPercent, ClassA::MyEnum status);

A类.cpp

emit changed(QString("string"), 50, ClassA::READING);

B类.h

public slots:
    void changed(QString text, int readTextInPercent, ClassA::MyEnum status);

B类.cpp

this->connect(m_ClassA, SIGNAL(changed(QString, int, ClassA::MyEnum)), this, SLOT(changed(QString, int, ClassA::MyEnum)));

void ClassB::changed(QString text, int readTextInPercent, ClassA::MyEnum status) {

}

我不知道我必须将qRegisterMetaType.

4

3 回答 3

7

你所要做的:

Q_DECLARE_METATYPE(ClassA::MyEnum)

在你的 classA.h 标题中。

然后在 ClassA 构造函数中(或 main() 但记得首先在其中包含 classa.h ):

qRegisterMetaType<ClassA::MyEnum>("ClassA::MyEnum");

然后像这样使用:

connect(whatever, SIGNAL(whatever_uses_myenum(ClassA::MyEnum)), ..., ...)

于 2013-08-28T00:51:14.783 回答
3

Qt 抛出的错误非常具有描述性:

确保使用 qRegisterMetaType() 注册 'ClassA::MyEnum'

所以你需要包括这一行:

qRegisterMetaType<ClassA::MyEnum>("ClassA::MyEnum");

在您知道它将被调用的代码的任何部分中。我曾经在我的应用程序的主要功能中包含 qRegisterMetaType。我建议您查看有关以下主题的 Qt 文档:qRegisterMetaType & Q_DECLARE_METATYPE。

于 2013-08-28T00:52:45.500 回答
2

您可以避免调用Q_DECLARE_METATYPEqRegisterMetaType()使用Qt 5.5 中添加的Q_ENUM

public:
    enum MyEnum {
        READING = 0,
        STOPPED = 1,
        FINISHED = 2
    };
    Q_ENUM(MyEnum)
于 2018-10-19T22:49:14.020 回答