我想在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
。
答案 0 :(得分:5)
你必须这样做:
Q_DECLARE_METATYPE(ClassA::MyEnum)
。
然后在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_METATYPE
和qRegisterMetaType()
:
public:
enum MyEnum {
READING = 0,
STOPPED = 1,
FINISHED = 2
};
Q_ENUM(MyEnum)