从私有成员公开 Q_PROPERTY

Lib*_*sik 5 c++ qt qproperty

在我正在编写的代码中,我需要Q_PROPERTY通过一个集成从私有成员公开QWidget。像这样的东西会很好:

class MyWidget: public QWidget{
   Q_OBJECT
   Q_PROPERTY(QString headerText MEMBER myLabel.text NOTIFY QLabel::notify)

private:
   QLabel myLabel
}
Run Code Online (Sandbox Code Playgroud)

是否可以这样做以及如何这样做?或者我是否必须手动编写所有获取/设置方法?

Adr*_*ire 2

你必须编写自己的 getter/setter:

QString getText()const{ return myLabel.text();}
void setText( const QString& s){ myLabel.setText(s);}
Run Code Online (Sandbox Code Playgroud)

在您可以为其定义 Q_PROPERTY 之后:

Q_PROPERTY( QString headerText READ getText WRITE setText)
Run Code Online (Sandbox Code Playgroud)

注意:对于某些版本的 Qt,您可能会发现一些技巧有效,但它们可能在以下版本中停止工作。因此,最好坚持常见/标准行为。

编辑:

为了给这个答案添加一点形式主义,这里有一个相关的错误:

https://bugreports.qt.io/browse/QTBUG-47695?jql=text%20~%20%22Q_PROPERTY%20member%22

总结:在 Qt<=5.4 中,可以在 Q_PROPERTY MEMBER 参数中使用结构成员。此功能“偶然起作用”,从现在起不再支持。

  • @AdrianMaire如果你有`struct MyStruct {...};`只需添加`Q_DECLARE_METATYPE(MyStruct)`然后你可以编写`Q_PROPERTY(MyStruct myProp READ myProp WRITE setMyProp NOTIFY myPropChanged)`。如果您执行更高级的操作,您可能需要添加对“qRegisterMetaType()”的调用。 (2认同)