Qt 是否可以在不使用成员函数的情况下实现Q_属性读/写访问器?

Qt 是否可以在不使用成员函数的情况下实现Q_属性读/写访问器?,qt,c++11,qml,Qt,C++11,Qml,通常,很多代码除了获取/设置类成员之外什么都不做。为此,我实现了一个简单的容器类来关联getter和setter 到一个“领域”。乍一看,这看起来还不错,代码也少得多。以下是容器类的外观: 成员.h #include <functional> template <class T> class Member { public: T data; using Getter_t = std::function<T(void)>; using Sette

通常,很多代码除了获取/设置类成员之外什么都不做。为此,我实现了一个简单的容器类来关联getter和setter 到一个“领域”。乍一看,这看起来还不错,代码也少得多。以下是容器类的外观:

成员.h

#include <functional>

template <class T>
class Member
{
public:
  T data;

  using Getter_t = std::function<T(void)>;
  using Setter_t = std::function<void(T)>;
  using Notify_t = std::function<void(void)>;

  Setter_t m_setterFunc;
  Getter_t m_getterFunc;
  Notify_t m_notifyFunc;

  Member()
  {
      this->m_getterFunc  = [=] (void) -> T  { return this->data; };
      this->m_setterFunc  = [=] (T data) -> void { this->data = data; };
      this->m_notifyFunc  = [] (void) -> void { };
  }

  auto get() -> T { return this->m_getterFunc(); }
  auto set(T data) -> void { this->m_setterFunc(data); this->m_notifyFunc(); }

  auto getter(Getter_t func) -> Member& { this->m_getterFunc  = func; return *this; }
  auto setter(Setter_t func) -> Member& { this->m_setterFunc  = func; return *this; }
  auto notify(Notify_t func) -> Member& { this->m_notifyFunc  = func; return *this; }

  ~Member() { }
};
现在的问题是
Q_属性
宏需要
READ
WRITE
访问器的函数名,而我又回到了起点:我必须为每个属性显式地编写get和set函数。这正是我想要避免的

class MyOtherClass : public QObject
{
    Q_OBJECT
    Q_PROPERTY(bool flag READ getFlag WRITE setFlag NOTIFY flagChanged);
public:
    Member<bool> m_flag;
    auto getFlag() -> bool { return m_flag.get(); }
    auto setFlag(bool flag) -> void { this->m_flag.set(flag); }
};
类MyOtherClass:公共QObject
{
Q_对象
Q_属性(bool标志READ getFlag WRITE setFlag NOTIFY flagChanged);
公众:
成员m_flag;
auto getFlag()->bool{return m_flag.get();}
自动设置标志(bool标志)->void{this->m_标志.set(标志);}
};
是否可以直接使用现有的
m_标志。获取
m_标志。设置
功能?我尝试了一些显而易见的东西,但要么被主运行中心拒绝,要么产生了太多的代码

编辑 如下所述,
MEMBER
关键字可以在不指定get和set函数的情况下拥有属性。但是,私有成员只能通过其名称(
this->property(“myPropertyName”)
)进行访问,而且除了“普通”的get和set之外,没有其他方法可以实现

更清楚地说:动机不仅仅是避免编写get和set函数,而是尝试实现一个灵活的成员系统

  • 默认情况下,按预期执行get/set
  • 支持自定义逻辑(例如,将新设置的值转发到其他实例)
  • 可以用于C++类成员,与Qt属性兼容
唯一缺少的部分是
Q_属性
读取
/
写入
访问器与
成员
类的get/set方法之间的桥梁


谢谢你的帮助

我不认为不编写包装器就可以将
READ
WRITE
属性方法重定向到其他内部或外部对象,但是如果您的getter和setter除了返回或设置数据之外什么都不做:至少在最新的Qt版本中存在
MEMBER
变量关联

发件人:

如果未指定成员变量,则需要读取访问器函数 明确规定。它用于读取属性值。理想情况下,常数 函数用于此目的,它必须返回 属性的类型或对该类型的常量引用。例如。, focus是一个只读属性,具有读取功能, QWidget::hasFocus()

写访问器函数是可选的。它用于设置属性 价值它必须返回void,并且必须只接受一个参数 属性的类型或指向该类型的指针或引用。例如。, QWidget::enabled具有写入函数QWidget::setEnabled()。 只读属性不需要写函数。e、 例如,QWidget::focus 没有写入功能

如果没有读取访问器功能,则需要成员变量关联 是指定的。这使给定的成员变量可读且 可写,无需创建读写访问器 功能。仍然可以使用读或写访问器函数 除了成员变量关联(但不是两者),如果需要 控制变量访问


使用
MEMBER
您不需要编写getter和setter。

也许您应该试试宏的魔力?将一个
Q_属性
宏包装到另一个宏,该宏将创建2个方法并声明一个属性。我不确定,但它可能与MOC编译器不兼容。另一种方法-是在运行时创建动态属性。@SaZ我将尽量避免使用宏。但动态属性可能是一个选项,我会尝试一下。谢谢你的提示!
class MyOtherClass : public QObject
{
    Q_OBJECT
    Q_PROPERTY(bool flag READ getFlag WRITE setFlag NOTIFY flagChanged);
public:
    Member<bool> m_flag;
    auto getFlag() -> bool { return m_flag.get(); }
    auto setFlag(bool flag) -> void { this->m_flag.set(flag); }
};
Q_PROPERTY(type name
           (READ getFunction [WRITE setFunction] |
            MEMBER memberName [(READ getFunction | WRITE setFunction)])
           [RESET resetFunction]
           [NOTIFY notifySignal]
           [REVISION int]
           [DESIGNABLE bool]
           [SCRIPTABLE bool]
           [STORED bool]
           [USER bool]
           [CONSTANT]
           [FINAL])