在 QML 中使用来自自定义 class 的 Q_PROPERTY
Use Q_PROPERTY's from a costum class in QML
我在 Qt 中遇到了一个 "design/implemantation" 问题。
目前我什至不确定这是否是一个聪明的设计......
这是我第一次 post 来这里,我真的不知道从哪里开始...
所以我会尝试这样...
目前我有这样的东西:
class NewProperty : public QObject
{
Q_OBJECT
Q_PROPERTY(QString name READ name WRITE setName)
.
.
.
public:
NewProperty(const QString &name, QObject *parent = 0);
QString name()const;
void setName(const QString &name);
.
.
.
private:
QString m_s_name;
};
那是 "NewProperty" Class 我想在 "MyClass" 中加入,因为最后会有的不仅仅是 "name" 属性。 .. NewProject.cpp 文件目前非常基础...
而且项目中还会有几个MyClasses
我的 "MyClass" 最后会有几个 "NewProperty" 的元素...
但是我不确定如何以 the/a right/nice 的方式将 "NewProperty" 传递给 QML。
我试着做这样的事情:
class QML_EMail : public Base_Output
{
Q_OBJECT
public:
NewProperty prop1;
NewProperty prop2;
.
.
.
};
main.cpp
...
qmlRegisterType<NewProperty> ("NewProperty", 1, 0, "NewProperty");
QML_EMail email
ctx->setContextProperty("email", QVariant::fromValue(&email));
...
如果我尝试在 QML 文件中这样调用:
import NewProperty 1.0
Rectangle {
id: emailStart
Component.onCompleted:
{
console.log(email.prop1.name)
}
我只收到此消息:类型错误:无法读取未定义的 属性 'name'
对于更好的编码,我将不胜感激任何帮助或提示...
问候,
萌
欢迎来到 Stack Overflow。
我认为 Qt 属性不能那样使用。如果您想从 QML 访问属性,class(基于 QObject
)成员必须使用 Q_PROPERTY
本身定义,以便 Qt 的元对象系统公开。所以你不能简单地使用另一个也有这样的属性的class。
本质上,您拥有具有属性的嵌套对象,因此如果您想在 QML 中使用它们,您还必须这样标记它们。如果不需要 getter 和 setter,一个简单的解决方案是使用 MEMBER 关键字:
Q_PROPERTY(NewProperty prop1 MEMBER prop1)
NewProperty prop1;
如果你想像 属性 那样使用它,你可能仍然需要将你的自定义 NewProperty
class 暴露给元系统。有关自定义类型的详细信息,请参阅 Creating Custom Qt Types。
我在 Qt 中遇到了一个 "design/implemantation" 问题。 目前我什至不确定这是否是一个聪明的设计...... 这是我第一次 post 来这里,我真的不知道从哪里开始...
所以我会尝试这样... 目前我有这样的东西:
class NewProperty : public QObject
{
Q_OBJECT
Q_PROPERTY(QString name READ name WRITE setName)
.
.
.
public:
NewProperty(const QString &name, QObject *parent = 0);
QString name()const;
void setName(const QString &name);
.
.
.
private:
QString m_s_name;
};
那是 "NewProperty" Class 我想在 "MyClass" 中加入,因为最后会有的不仅仅是 "name" 属性。 .. NewProject.cpp 文件目前非常基础...
而且项目中还会有几个MyClasses
我的 "MyClass" 最后会有几个 "NewProperty" 的元素... 但是我不确定如何以 the/a right/nice 的方式将 "NewProperty" 传递给 QML。 我试着做这样的事情:
class QML_EMail : public Base_Output
{
Q_OBJECT
public:
NewProperty prop1;
NewProperty prop2;
.
.
.
};
main.cpp
...
qmlRegisterType<NewProperty> ("NewProperty", 1, 0, "NewProperty");
QML_EMail email
ctx->setContextProperty("email", QVariant::fromValue(&email));
...
如果我尝试在 QML 文件中这样调用:
import NewProperty 1.0
Rectangle {
id: emailStart
Component.onCompleted:
{
console.log(email.prop1.name)
}
我只收到此消息:类型错误:无法读取未定义的 属性 'name'
对于更好的编码,我将不胜感激任何帮助或提示...
问候,
萌
欢迎来到 Stack Overflow。
我认为 Qt 属性不能那样使用。如果您想从 QML 访问属性,class(基于 QObject
)成员必须使用 Q_PROPERTY
本身定义,以便 Qt 的元对象系统公开。所以你不能简单地使用另一个也有这样的属性的class。
本质上,您拥有具有属性的嵌套对象,因此如果您想在 QML 中使用它们,您还必须这样标记它们。如果不需要 getter 和 setter,一个简单的解决方案是使用 MEMBER 关键字:
Q_PROPERTY(NewProperty prop1 MEMBER prop1)
NewProperty prop1;
如果你想像 属性 那样使用它,你可能仍然需要将你的自定义 NewProperty
class 暴露给元系统。有关自定义类型的详细信息,请参阅 Creating Custom Qt Types。