2017-02-20 83 views
1

在我正在處理的代碼中,我需要通過一個集成QWidget從私有成員中公開Q_PROPERTIES。這是很好的東西:從私有成員中暴露q_property

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

private: 
    QLabel myLabel 
} 

是否有可能這樣做和如何?還是必須手動編寫所有get/set方法?

+0

目前,只有修改moc纔可能。請注意'QLabel'沒有通知信號。 –

回答

1

你必須寫自己的getter/setter:

QString getText()const{ return myLabel.text();} 
void setText(const QString& s){ myLabel.setText(s);} 

而且之後你可以爲它定義一個Q_PROPERTY:

Q_PROPERTY(QString headerText READ getText WRITE setText) 

注:Qt的一些版本中,你可能會發現有些技巧工作,但他們可能會停止在以下版本中工作。出於這個原因,堅持常見/標準行爲可能會更好。

編輯:

要有點形式主義添加到這個答案,這裏是一個相關的bug:

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

彙總:在Qt < = 5.4是可以使用結構成員Q_PROPERTY MEMBER參數。此功能「偶然工作」,直到現在才支持。

+0

我希望有一些標準的方法,而不必重新實現所有的getter和setter。 –

+0

還有改進的空間,我同意:例如,我也錯過了定製類型(struct/class)的Q_PROPERTY和訪問struct/class的成員的Q_PROPERTY。 –

+0

@AdrianMaire你可以在自定義類型中使用'Q_PROPERTY'。 _「屬性使用的自定義類型需要使用Q_DECLARE_METATYPE()宏進行註冊,以便它們的值可以存儲在QVariant對象中,這使得它們適用於在類定義中使用Q_PROPERTY()宏聲明的靜態屬性和動態在運行時創建屬性。「_ –