自定义类型的 Qml 属性

Qml property of custom type

我有一个class定义如下:

class Set : public QObject {
    Q_OBJECT
    …
};

它是 qmR​​egisterType'd,因此可在 QML 中使用。 我想在 class 属性 中自定义类型 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)

和集合中的属性:

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++ class 和 QML 中使用此类型的 属性 的正确方法应该是什么?这个类型也是qmlRegisterType。

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

如果您的自定义 属性 类型 SetRange 派生自 QObject,正如@Vercetti 在评论中指出的那样不可复制,那么您的 属性 range 不能使用 SetRange 作为它的类型,因为函数 setRange() 将不起作用。

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

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

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