在我正在处理的代码中,我需要通过一个集成的QWidget从私有成员公开Q_PROPERTIES。这将是件好事:
class MyWidget: public QWidget{
Q_OBJECT
Q_PROPERTY(QString headerText MEMBER myLabel.text NOTIFY QLabel::notify)
private:
QLabel myLabel
}
有可能这样做吗?或者我是否必须手动编写所有get / set方法?
答案 0 :(得分:2)
你必须编写自己的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,您可能会发现一些技巧,但它们可能会停止在以下版本中工作。因此,坚持共同/标准行为可能更好。
编辑:
在这个答案中添加一些形式主义,这是一个相关的错误:
https://bugreports.qt.io/browse/QTBUG-47695?jql=text%20~%20%22Q_PROPERTY%20member%22
总结:在Qt< = 5.4中,可以在Q_PROPERTY MEMBER参数中使用结构成员。这个功能"偶然工作"从现在开始不受支持。
答案 1 :(得分:0)
OP希望避免如果我们不想公开Q_PROPERTY,则不需要编写手动编写的getter / setter对。
我没有解决方案,但是我仍然对该问题的“私人成员”方面感兴趣。
在我的情况下,我到达这里是因为我想将所有Qt绑定代码的所有 EXCEPT 必需的设置器隐藏起来。
根据经验,使用Qt 5.12对我来说确实适用:
class HolderOfSomeInteger : public QObject {
Q_OBJECT
Q_PROPERTY(int someInt
READ GetInt
NOTIFY someIntChanged)
signals:
void someIntChanged();
private: // <--- private section
// My own other classes cannot access this, but
// the QML binding works as expected anyhow.
int GetInt() const { return some_integer; }
int some_integer = 0;
};
因此,除了将int
数据成员some_integer
保持私有之外,我显然也可以简单地将GetInt()
getter放在private
部分中。
但是,正如@ adrian-maire在https://stackoverflow.com/a/42348046/10278中说的那样,“对于某些版本的Qt,您可能会发现一些技巧,但在随后的版本中它们可能会停止工作。”
今天this Qt Property System documentation看起来只有
“如果没有MEMBER变量,则需要READ访问器函数 指定。用于读取属性值。理想情况下,const 函数用于此目的,并且必须返回 属性的类型或对该类型的const引用。”
它没有说明访问器功能必须是公共的还是私有的。
我进一步挖掘了一些东西,我想我发现了为什么属性绑定仍然可以与私有getter一起使用的原因。
Q_OBJECT
宏声明您的类具有方法qt_metacall
和qt_static_metacall
。然后,Qt的MOC
会生成这些方法的主体。
使用这些方法完成属性绑定。由于这些方法是您的类的成员,因此它们(当然)甚至可以调用您的类提供的private
成员函数。