【发布时间】:2015-06-02 20:13:40
【问题描述】:
我有一个类定义如下:
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。
更新:如果属性范围声明为 SetRange*(指向 SetRange 的指针)并且相应地修改其他代码,即使没有 Q_DECLARE_METATYPE 也能正常工作。那么自定义类型的 QML 属性是否应该始终是指向该类型的指针?
【问题讨论】:
-
你可能需要
SetRange的复制构造函数? -
如果我添加复制构造函数会导致“使用已删除函数 'QObject& QObject::operator=(const QObject&)”错误。顺便说一句,“qobject.h”中有 Q_DISABLE_COPY(QObject) 声明。
-
请发布有效的代码。
lowerBoundChanged和lowerLength信号不存在。如果缺少代码,我们应该如何帮助解决编译错误? -
哦,我的错。上面的代码已经更正了。
标签: c++ properties qml custom-type