使用QML

时间:2017-10-06 10:48:22

标签: c++ qt qml qproperty

我坚持使用"设计/实施"问题在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;
};

那是" NewProperty"我希望在" MyClass"最终会有一个不仅仅是一个名字"属性... NewProject.cpp文件目前非常基本......

项目中还会有几个MyClasses。

My" 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:无法读取属性&#39; name&#39;未定义的

我很感激任何有关更好编码的帮助或提示......

的问候,

1 个答案:

答案 0 :(得分:2)

欢迎使用Stack Overflow。

我不认为Qt属性可以这样使用。如果要从QML访问属性,则必须使用QObject本身定义类(基于Q_PROPERTY)成员,以便由Qt的元对象系统公开。所以你不能简单地使用另一个同样具有属性的类。

基本上你有嵌套对象的属性,所以如果你想在QML中使用它们,你也必须这样标记它们。一个简单的解决方案是,如果您不需要getter和setter,则使用MEMBER关键字:

Q_PROPERTY(NewProperty prop1 MEMBER prop1)
NewProperty prop1;

如果要将自定义NewProperty类用作属性,则可能还需要将其公开给元系统。有关自定义类型的详细信息,请参阅Creating Custom Qt Types