在 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