Свойство Qml пользовательского типа

У меня есть класс, определенный следующим образом:

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

Решение

Если ваш пользовательский тип свойства SetRange происходит от QObject который нельзя скопировать, как указано в комментарии @Vercetti, то ваша собственность range не можете использовать SetRange как его тип, потому что функция setRange() не будет работать.

Одним из решений является использование указателя на SetRange как тип для вашей собственности range, как вы уже предложили:

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

Я использовал это решение во всех моих пользовательских типах свойств, которые получены из QObject. Это всегда работает и похоже на стандартный шаблон кодирования для меня.

1

Другие решения