为具有自己的 Q_PROPERTY 的 QObject 创建一个 Q_PROPERTY
Create a Q_PROPERTY to a QObject which has it's own Q_PROPERTY's
我有一个 QInnerItem
和两个 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;
};
还有一个由QInnerItem
和一个整数组成的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 &)': attempting to reference a deleted function
我相信这是因为 QObject 有一个明确删除的复制赋值运算符:https://doc.qt.io/qt-5/qobject.html#no-copy-constructor-or-assignment-operator
有什么方法可以在不使用复制赋值运算符的情况下访问对 m_bar
的引用?
来自同一个link,它还说:
“主要结果是您应该使用指向 QObject(或您的 QObject 子类)的指针,否则您可能会想将您的 QObject 子类用作值。例如,没有复制构造函数,您可以' t 使用 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。
您误解了您引用的内容:“您应该使用指向 QObject 的指针”。实际的成员变量是不是指针并不重要。重要的是如何访问 Q_PROPERTY。所以你可以这样做:
class QOuterItem : public QObject {
Q_OBJECT
Q_PROPERTY(QInnerItem *bar READ bar)
public:
QInnerItem *bar() const {
return &m_bar;
}
private:
QInnerItem m_bar;
};
我有一个 QInnerItem
和两个 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;
};
还有一个由QInnerItem
和一个整数组成的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 &)': attempting to reference a deleted function
我相信这是因为 QObject 有一个明确删除的复制赋值运算符:https://doc.qt.io/qt-5/qobject.html#no-copy-constructor-or-assignment-operator
有什么方法可以在不使用复制赋值运算符的情况下访问对 m_bar
的引用?
来自同一个link,它还说:
“主要结果是您应该使用指向 QObject(或您的 QObject 子类)的指针,否则您可能会想将您的 QObject 子类用作值。例如,没有复制构造函数,您可以' t 使用 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。
您误解了您引用的内容:“您应该使用指向 QObject 的指针”。实际的成员变量是不是指针并不重要。重要的是如何访问 Q_PROPERTY。所以你可以这样做:
class QOuterItem : public QObject {
Q_OBJECT
Q_PROPERTY(QInnerItem *bar READ bar)
public:
QInnerItem *bar() const {
return &m_bar;
}
private:
QInnerItem m_bar;
};