自定义类型的Qml属性

时间:2015-06-02 20:13:41

标签: c++ properties qml custom-type

我的课程定义如下:

class Set : public QObject {
    Q_OBJECT
    …
};

它的qmRegisterType' d等在QML中可用。 我希望自定义类型SetRange的类属性,其定义如下:

class SetRange : public QObject {
public:
    SetRange ( QObject *parent = 0 ) : QObject::QObject(parent) { }
    Q_PROPERTY(int lowerBound MEMBER lower_bound WRITE setLowerBound NOTIFY lowerBoundChanged)
    Q_PROPERTY(int length MEMBER length WRITE setLength NOTIFY lengthChanged)
    int lower_bound, length;
    void setLowerBound ( int lower_bound ) {
        if ( lower_bound != this->lower_bound )
            emit lowerBoundChanged(this->lower_bound = lower_bound);
    }
    void setLength ( int length ) {
        if ( length != this->length )
            emit lengthChanged(this->length = length);
    }
signals:
    void lowerBoundChanged ( int lower_bound );
    void lengthChanged ( int length );
};
Q_DECLARE_METATYPE(SetRange)

Set内的属性:

Q_PROPERTY(SetRange range READ range WRITE setRange NOTIFY rangeChanged)
void setRange ( SetRange const &range );
SetRange range ( ) const;

我希望在QML中使用它如下:

Set {
    …
    range: Range {
        lowerBound: …
        length: …
    }
}

目前我有编译时错误:使用已删除的函数:SetRange :: SetRange(SetRange&&) 在C ++类和QML中,声明自定义类型以便能够使用此类型的属性应该是什么样的正确方法?此类型也是qmlRegisterType' d。

更新:即使没有Q_DECLARE_METATYPE也可以正常工作,如果属性范围声明为SetRange *(指向SetRange的指针),则相应地修改其他代码。那么自定义类型的QML属性应该始终是指向这种类型的指针吗?

1 个答案:

答案 0 :(得分:1)

如果您的自定义媒体资源类型SetRange来自QObject,而@ {1}}无法按照@Vercetti的评论中指出的那样进行复制,则您的媒体资源range无法使用SetRange作为其类型,因为函数setRange()将不起作用。

一种解决方案是使用指向SetRange的指针作为您的财产range的类型,正如您已经建议的那样:

Q_PROPERTY(SetRange * range READ range WRITE setRange NOTIFY rangeChanged)

我一直在从QObject派生的所有自定义属性类型中使用此解决方案。这总是有效的,就像我的标准编码模式一样。