【问题标题】:Qml property of custom type自定义类型的 Qml 属性
【发布时间】:2015-06-02 20:13:40
【问题描述】:

我有一个类定义如下:

class Set : public QObject {
    Q_OBJECT
    …
};

它是 qmR​​egisterType'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) 声明。
  • 请发布有效的代码。 lowerBoundChangedlowerLength 信号不存在。如果缺少代码,我们应该如何帮助解决编译错误?
  • 哦,我的错。上面的代码已经更正了。

标签: c++ properties qml custom-type


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-13
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多