Qt在课堂上自己的枚举

时间:2013-08-28 00:22:02

标签: c++ qt enums signals-slots

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

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

这是我的源代码:

ClassA.h

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

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

ClassA.cpp

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

ClassB.h

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

ClassB.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

3 个答案:

答案 0 :(得分:5)

你必须这样做:

Q_DECLARE_METATYPE(ClassA::MyEnum)

在你的classA.h标题中

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

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

然后使用:

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

答案 1 :(得分:2)

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

  

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

所以你需要包括这一行:

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

在你知道它将被调用的代码的任何部分。我用来在我的应用程序的main函数中包含qRegisterMetaType。我建议您查看有关主题的Qt文档:qRegisterMetaType&amp; Q_DECLARE_METATYPE。

答案 2 :(得分:0)

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

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