在 QML 中使用自定义类中的 Q_PROPERTY
Posted
技术标签:
【中文标题】在 QML 中使用自定义类中的 Q_PROPERTY【英文标题】:Use Q_PROPERTY's from a costum class in QML 【发布时间】:2017-10-06 10:48:21 【问题描述】:我在 Qt 中遇到了“设计/实现”问题。 目前我什至不确定这是否是一个聪明的设计...... 这是我在这里的第一篇文章,我真的不知道从哪里开始......
所以我试试是这样的... 目前我有这样的事情:
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;
;
那是我想在“MyClass”中拥有的“NewProperty”类,因为最终将不仅仅是一个“名称”属性...... NewProject.cpp 文件目前非常基本......
而且项目中还会有几个MyClass。
我的“MyClass”最后会有几个“NewProperty”的元素... 但我不确定如何以正确/好的方式将“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)
我只收到此消息:TypeError: Cannot read property 'name' of undefined
对于更好的编码,我将不胜感激任何帮助或提示...
问候,
萌
【问题讨论】:
【参考方案1】:欢迎来到 Stack Overflow。
我不认为 Qt 属性可以这样使用。如果您想从 QML 访问属性,则必须使用 Q_PROPERTY
本身定义类(基于QObject
)成员,以便由 Qt 的元对象系统公开。所以你不能简单地使用另一个类也有这样的属性。
本质上,您拥有带有属性的嵌套对象,因此如果您想在 QML 中使用它们,您还必须将它们标记为此类。如果您不需要 getter 和 setter,一个简单的解决方案是使用 MEMBER 关键字:
Q_PROPERTY(NewProperty prop1 MEMBER prop1)
NewProperty prop1;
如果您想像这样使用它作为属性,您可能仍需要将您的自定义 NewProperty
类公开给元系统。有关自定义类型的更多信息,请参阅 Creating Custom Qt Types。
【讨论】:
非常感谢...您拯救了我的周末。我完全忽略了文档中的 MEMBER 值。很有帮助以上是关于在 QML 中使用自定义类中的 Q_PROPERTY的主要内容,如果未能解决你的问题,请参考以下文章