2017-10-06 26 views
1

我在Qt中遇到了一个“设计/实现”问题。 目前我甚至不确定这是否是一个聪明的设计... 这是我的第一篇文章,我不知道从哪里开始...使用QML中Costum类中的Q_PROPERTY's

所以我会试试这个方法。 .. 目前,我有这样的事情:

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文件目前是非常基本的...

而且项目中还会有几个MyClass。

我的“MyClass”最后会有几个“NewProperty”的元素... 但我不确定如何以/ 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) 
} 

我只得到这个消息:TypeError:无法读取未定义的属性“名称”

我将不胜感激帮助或为了更好的编码提示...

问候,

回答

1

欢迎堆栈溢出。

我不认为Qt属性可以这样使用。如果你想从QML访问属性,那么这个类(基于QObject)的成员必须用Q_PROPERTY自己定义,才能被Qt的元对象系统公开。所以你不能简单地使用另一个也具有属性的类。

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

Q_PROPERTY(NewProperty prop1 MEMBER prop1) 
NewProperty prop1; 

你仍然可能需要您的自定义NewProperty类暴露元系统,如果你想使用它像一个属性。有关自定义类型的更多信息,请参阅Creating Custom Qt Types

+0

非常感谢你......你救了我的周末。我完全忽略了文档中的MEMBER值。很有帮助 – mBucks