具有 C++ 枚举类型的 QML 信号
QML signal with a C++ enum type
我有一个 class,我将其暴露给 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定义为:
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
但无法引用枚举类型
好的,这似乎不能用枚举来完成,即你必须使用 ints
。我做了以下更改并且有效:
class MyType : public QObject
{
Q_OBJECT
Q_ENUMS(TestEnum)
Q_PROPERTY(TestEnum foo READ foo WRITE setFoo NOTIFY fooChanged)
public:
enum TestEnum
{
State1 = 1,
State2 = 2
};
MyType(QObject *parent = nullptr) :
QObject(parent),
mFoo(TestEnum::State1)
{
}
TestEnum & foo()
{
return mFoo;
}
void setFoo(TestEnum foo)
{
if (foo == mFoo)
return;
mFoo = foo;
emit fooChanged(static_cast<int>(mFoo));
}
signals:
void fooChanged(int blah);
private:
TestEnum mFoo;
};
Q_DECLARE_METATYPE(MyType::TestEnum)
插槽也需要更改:
class HandleTextField : public QObject
{
Q_OBJECT
public:
explicit HandleTextField(QObject *parent = 0);
public slots:
void handleSubmitTextField(int in);
void handleFooChanged(int in);
public:
MyType myType;
};
我们需要更改 int
类型的连接:
QObject::connect(topLevel, SIGNAL(submitTextField(int)),
&handleTextField, SLOT(handleSubmitTextField(int)));
最后信号声明为:
signal submitTextField(int text)
我有一个 class,我将其暴露给 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定义为:
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
但无法引用枚举类型
好的,这似乎不能用枚举来完成,即你必须使用 ints
。我做了以下更改并且有效:
class MyType : public QObject
{
Q_OBJECT
Q_ENUMS(TestEnum)
Q_PROPERTY(TestEnum foo READ foo WRITE setFoo NOTIFY fooChanged)
public:
enum TestEnum
{
State1 = 1,
State2 = 2
};
MyType(QObject *parent = nullptr) :
QObject(parent),
mFoo(TestEnum::State1)
{
}
TestEnum & foo()
{
return mFoo;
}
void setFoo(TestEnum foo)
{
if (foo == mFoo)
return;
mFoo = foo;
emit fooChanged(static_cast<int>(mFoo));
}
signals:
void fooChanged(int blah);
private:
TestEnum mFoo;
};
Q_DECLARE_METATYPE(MyType::TestEnum)
插槽也需要更改:
class HandleTextField : public QObject
{
Q_OBJECT
public:
explicit HandleTextField(QObject *parent = 0);
public slots:
void handleSubmitTextField(int in);
void handleFooChanged(int in);
public:
MyType myType;
};
我们需要更改 int
类型的连接:
QObject::connect(topLevel, SIGNAL(submitTextField(int)),
&handleTextField, SLOT(handleSubmitTextField(int)));
最后信号声明为:
signal submitTextField(int text)