创建一个 Q_PROPERTY 到一个 QObject,它有自己的 Q_PROPERTY

发布于 2025-01-11 09:59:57 字数 2567 浏览 2 评论 0原文

我有一个带有两个 Q_PROPERTIES 的 QInnerItem

class QInnerItem : public QObject {
    Q_OBJECT
    Q_PROPERTY(int bar1 READ bar1 WRITE setBar1 NOTIFY bar1Changed)
    Q_PROPERTY(int bar2 READ bar2 WRITE setBar2 NOTIFY bar2Changed)

public:

    QInnerItem(QObject* owner) : QObject(owner) {}

    void setBar1(const int& bar1) {
        m_bar1 = bar1;
        emit bar1Changed();
    }
    int bar1() const {
        return m_bar1;
    }
    void setBar2(const int& bar2) {
        m_bar2 = bar2;
        emit bar2Changed();
    }
    int bar2() const {
        return m_bar2;
    }
signals:
    void bar1Changed();
    void bar2Changed();
private:
    int m_bar1;
    int m_bar2;
};

和一个由 QInnerItem 和 int 组成的 QOuterItem 。

class QOuterItem : public QObject {
    Q_OBJECT
    Q_PROPERTY(int foo READ foo WRITE setFoo NOTIFY fooChanged)
    Q_PROPERTY(QInnerItem bar READ bar)
public:
    void setFoo(const int& foo) {
        m_foo = foo;
        emit fooChanged();
    }
    int foo() const {
        return m_foo;
    }
    const QInnerItem& bar() const { //must return either the property's type or a const reference to that type
        return m_bar;
    }
signals:
    void fooChanged();
private:
    int m_foo;
    QInnerItem m_bar;
};

这给了我错误:

moc_Model.cpp:264: error: C2280: 'QInnerItem &QInnerItem::operator =(const QInnerItem &)':试图引用已删除的函数

我相信这是因为 QObject 有一个显式删除的复制赋值运算符:https://doc.qt.io/ qt-5/qobject.html#no-copy-constructor-or-assignment-operator

有没有办法在不使用复制赋值运算符的情况下访问对 m_bar 的引用?

在同一链接中,它还说:

“主要结果是您应该使用指向 QObject(或 QObject 子类)的指针,否则您可能会想使用 QObject 子类作为值。例如,没有复制构造函数,您不能使用 QObject 的子类作为要存储在容器类之一中的值。”

所以我尝试过:

class QOuterItem : public QObject {
    Q_OBJECT
    Q_PROPERTY(int foo READ foo WRITE setFoo NOTIFY fooChanged)
    Q_PROPERTY(QInnerItem bar READ bar)
public:
    void setFoo(const int& foo) {
        m_foo = foo;
        emit fooChanged();
    }
    int foo() const {
        return m_foo;
    }
    const QInnerItem& bar() const { //must return either the property's type or a const reference to that type
        return *m_bar;
    }
signals:
    void fooChanged();
private:
    int m_foo;
    QInnerItem* m_bar = new QInnerItem(this);
};

但这给出了完全相同的错误。

我怎样才能实现我想要做的事情?即:拥有一个具有属性的 QObject,并且这些属性之一是具有其自己的属性的 QObject。

I have an QInnerItem with two Q_PROPERTIES

class QInnerItem : public QObject {
    Q_OBJECT
    Q_PROPERTY(int bar1 READ bar1 WRITE setBar1 NOTIFY bar1Changed)
    Q_PROPERTY(int bar2 READ bar2 WRITE setBar2 NOTIFY bar2Changed)

public:

    QInnerItem(QObject* owner) : QObject(owner) {}

    void setBar1(const int& bar1) {
        m_bar1 = bar1;
        emit bar1Changed();
    }
    int bar1() const {
        return m_bar1;
    }
    void setBar2(const int& bar2) {
        m_bar2 = bar2;
        emit bar2Changed();
    }
    int bar2() const {
        return m_bar2;
    }
signals:
    void bar1Changed();
    void bar2Changed();
private:
    int m_bar1;
    int m_bar2;
};

And a QOuterItem that is composed with a QInnerItem and an int.

class QOuterItem : public QObject {
    Q_OBJECT
    Q_PROPERTY(int foo READ foo WRITE setFoo NOTIFY fooChanged)
    Q_PROPERTY(QInnerItem bar READ bar)
public:
    void setFoo(const int& foo) {
        m_foo = foo;
        emit fooChanged();
    }
    int foo() const {
        return m_foo;
    }
    const QInnerItem& bar() const { //must return either the property's type or a const reference to that type
        return m_bar;
    }
signals:
    void fooChanged();
private:
    int m_foo;
    QInnerItem m_bar;
};

This gives me the error:

moc_Model.cpp:264: error: C2280: 'QInnerItem &QInnerItem::operator =(const QInnerItem &)': attempting to reference a deleted function

I believe this is because a QObject has an explicitly deleted copy assignment operator: https://doc.qt.io/qt-5/qobject.html#no-copy-constructor-or-assignment-operator

Is there any way to access a reference to m_bar without the copy assignment operator?

From the same link, it also says:

"The main consequence is that you should use pointers to QObject (or to your QObject subclass) where you might otherwise be tempted to use your QObject subclass as a value. For example, without a copy constructor, you can't use a subclass of QObject as the value to be stored in one of the container classes. You must store pointers."

So I have tried:

class QOuterItem : public QObject {
    Q_OBJECT
    Q_PROPERTY(int foo READ foo WRITE setFoo NOTIFY fooChanged)
    Q_PROPERTY(QInnerItem bar READ bar)
public:
    void setFoo(const int& foo) {
        m_foo = foo;
        emit fooChanged();
    }
    int foo() const {
        return m_foo;
    }
    const QInnerItem& bar() const { //must return either the property's type or a const reference to that type
        return *m_bar;
    }
signals:
    void fooChanged();
private:
    int m_foo;
    QInnerItem* m_bar = new QInnerItem(this);
};

But this gives the exact same error.

How can I achieve what I am trying to do? i.e: Have a QObject with properties, and one of those properties is a QObject with it's own properties.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

无戏配角 2025-01-18 09:59:57

您误解了您引用的内容:“您应该使用指向 QObject 的指针”。实际的成员变量是否是指针并不重要。重要的是如何访问 Q_PROPERTY。所以你可以这样做:

class QOuterItem : public QObject {
    Q_OBJECT
    Q_PROPERTY(QInnerItem *bar READ bar CONSTANT)
public:
    QInnerItem *bar() const {
        return &m_bar;
    }
private:
    QInnerItem m_bar;
};

You were misunderstanding what you quoted: "you should use pointers to QObject". It doesn't matter if the actual member variable is a pointer or not. What matters is how the Q_PROPERTY is accessed. So you can do something like this:

class QOuterItem : public QObject {
    Q_OBJECT
    Q_PROPERTY(QInnerItem *bar READ bar CONSTANT)
public:
    QInnerItem *bar() const {
        return &m_bar;
    }
private:
    QInnerItem m_bar;
};
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文