Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从私有成员公开q_属性_C++_Qt_Qproperty - Fatal编程技术网

C++ 从私有成员公开q_属性

C++ 从私有成员公开q_属性,c++,qt,qproperty,C++,Qt,Qproperty,在我正在编写的代码中,我需要通过一个集成的QWidget公开来自私有成员的Q_属性。像这样的东西会很好: class MyWidget: public QWidget{ Q_OBJECT Q_PROPERTY(QString headerText MEMBER myLabel.text NOTIFY QLabel::notify) private: QLabel myLabel } 有可能这样做吗?如何做到?或者我必须手动编写所有的get/set方法吗?您必须编写自己的ge

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

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

private:
   QLabel myLabel
}

有可能这样做吗?如何做到?或者我必须手动编写所有的get/set方法吗?

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

QString getText()const{ return myLabel.text();}
void setText( const QString& s){ myLabel.setText(s);}
在为其定义Q_属性之后:

Q_PROPERTY( QString headerText READ getText WRITE setText)
注意:对于某些版本的Qt,您可能会发现一些技巧起作用,但在以下版本中它们可能会停止工作。出于这个原因,坚持普通/标准行为可能更好

编辑:

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


总结:在Qt中,OP希望避免手工编写getter/setter对样板,如果我们不想公开Q_属性,就不需要编写这些样板

我没有解决这个问题的办法,但我仍然对这个问题的“私人成员”方面感兴趣

在我的例子中,我来到这里是因为我想对除Qt绑定代码之外的所有其他代码隐藏这些必需的setter

根据经验,使用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;
   };
class HolderOfSomeInteger:公共QObject{
Q_对象
Q_性质(int-someInt)
读取GetInt
通知某人(已更改)
信号:
void someIntChanged();

private://目前,通常只能通过修改moc来实现。请注意,
QLabel
没有通知信号。我希望有一些标准方法,而不必重新实现所有getter和setter。我同意,还有改进的余地:例如,我还缺少自定义类型(struct/class)的Q_属性和Q_属性访问结构/类的成员。@AdrianMail您可以将
Q_属性
与自定义类型一起使用。“属性使用的自定义类型需要使用Q_DECLARE_元类型()宏,使其值可以存储在QVariant对象中。这使它们既适用于在类定义中使用Q_PROPERTY()宏声明的静态属性,也适用于在运行时创建的动态属性。”@本杰明:据我所知,您可以使用QVariant,但不能使用自定义结构。此外,QtCreator不会理解您的类型。如果我错了,请提供一个示例,这将非常有用。@AdrianMail如果您有
struct MyStruct{…};
只需添加
Q\u DECLARE\u METATYPE(MyStruct)
,然后您就可以编写
Q\u属性(MyStruct myProp READ myProp WRITE setMyProp NOTIFY myPropChanged)
。如果执行更高级的操作,您可能需要添加对
qRegisterMetaType()
的调用。