自定义类型的 Qml 属性
Qml property of custom type
我有一个class定义如下:
class Set : public QObject {
Q_OBJECT
…
};
它是 qmRegisterType'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 的所有自定义 属性 类型中使用此解决方案。这总是有效的,对我来说就像一个标准的编码模式。
我有一个class定义如下:
class Set : public QObject {
Q_OBJECT
…
};
它是 qmRegisterType'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 的所有自定义 属性 类型中使用此解决方案。这总是有效的,对我来说就像一个标准的编码模式。