【发布时间】:2017-09-06 09:01:17
【问题描述】:
我有一个要向 QML 公开的课程,如下所示:
#ifndef MYTYPE_H
#define MYTYPE_H
#include <QString>
#include <QObject>
class MyType : public QObject
{
Q_OBJECT
Q_ENUMS(TestEnum)
Q_PROPERTY(TestEnum foo READ foo WRITE setFoo NOTIFY fooChanged)
public:
enum class TestEnum
{
State1 = 1,
State2 = 2
};
MyType(QObject *parent = nullptr) :
QObject(parent),
mFoo(TestEnum::State1)
{
}
TestEnum foo() const
{
return mFoo;
}
void setFoo(TestEnum foo)
{
if (foo == mFoo)
return;
mFoo = foo;
emit fooChanged(mFoo);
}
signals:
void fooChanged(MyType::TestEnum blah);
private:
TestEnum mFoo;
};
Q_DECLARE_METATYPE(MyType::TestEnum)
#endif // MYTYPE_H
这里我有一个枚举类型,我想向 QML 公开它。
我将主函数调用的类型注册为:
qmlRegisterType<MyType>("App", 1, 0, "MyType");
现在我的 qml 文件中有一个信号,我采用了这个枚举参数:
signal submitTextField(MyType::TestEnum state) // Compiler complains here
信号连接为:
QObject *topLevel = engine.rootObjects().value(0);
//QQuickWindow *window = qobject_cast<QQuickWindow *>(topLevel);
// This is just a class that implements the slot
HandleTextField handleTextField;
// connect our QML signal to our C++ slot
QObject::connect(topLevel, SIGNAL(submitTextField(MyType::TestEnum)),
&handleTextField, SLOT(handleSubmitTextField(MyType::TestEnum)));
实现slot的类定义为:
class HandleTextField : public QObject
{
Q_OBJECT
public:
explicit HandleTextField(QObject *parent = 0);
public slots:
void handleSubmitTextField(MyType::TestEnum in);
void handleFooChanged(MyType::TestEnum in);
public:
MyType myType;
};
语法MyType::TestEnum 无效。我很想将所有内容都转换为 ints 并取消枚举,但想知道是否有办法在 QML 信号中使用这种枚举类型。 MyType.State1 and MyType.State2 可以,但无法引用枚举类型。
【问题讨论】:
-
无法引用枚举类型是什么意思?你想做什么?
-
@perencia 编辑了一些代码。只是想在 C++ 和 Qt 之间做一个信号槽连接,其中 QML 中定义的信号采用枚举类型作为参数
标签: qt enums qml signals-slots