【问题标题】:Can a Q_PROPERTY be generalized for multiple base classes?Q_PROPERTY 可以泛化为多个基类吗?
【发布时间】:2019-03-23 09:06:27
【问题描述】:

我正在尝试为将保存在容器中的一些数据编写一个包装器。该数据将与 QML 进行交互,此后将包含 Q_PROPERTIES。但是,我希望这些数据派生自特定的基类,因此我可以调用重写的方法而无需强制转换。这是一个例子。

class Base : public QObject
{
    Q_OBJECT
    Q_PROPERTY(int value READ value WRITE setValue NOTIFY valueChanged)

public:
    /*implementation is irrelevant, just boilerplate code*/
}

class BaseBool : public Base {
    Q_PROPERTY(bool value READ value WRITE setValue NOTIFY valueChanged)

public:
        /*I want to override the functions here so I can just call them
        like I would for a base class, but I want them to be different types.
        I want to extend this for other types too.*/
}

希望这是有道理的。显然,模板化类并具有 T 类型的 Q_PROPERTY 将是理想的,但是对于当前的 Qt,这是不可能的。有没有合适的解决方案?可能有更好的设计模式可以解决这个问题,但我现在不知所措。

【问题讨论】:

  • 这是您要找的吗? (stackoverflow.com/questions/29683341/…)
  • 另一个解决方案可能是QVariantMap
  • @Amfasis - 我看到了,但并没有真正做到我想要的。我想要一种通用的方法来从对象及其派生类中引用“值”。我想调用 Base.getValue() 并返回一个 bool、int 等。我意识到这对 Qt 来说有点复杂,因为我无法模板化 QObject 类。但是,我认为我选择了一种 QVariant 类型的解决方案来包装我的价值观。
  • 但不允许有与 C++ 不同的返回值 (stackoverflow.com/questions/8967303/…)。但是,IIRC 您可以覆盖 Q_PROPERTY,您可以在其中指定不同的 READ 函数(例如,BASEREAD valueIntBaseBoolREAD valueBool
  • 我看不到合适的用例。 C++ 是类型化的,在什么情况下你会在基类指针上使用getValue 函数,而返回类型取决于派生类?

标签: c++ qt inheritance signals-slots


【解决方案1】:

Qt 的所有元数据都可以在运行时生成,或者使用 C++ 编译器而不是 moc。这些属性可以在运行中或在编译期间合成,对于模板类来说不会是问题。你要找的是Verdigris。只要你有足够现代的编译器,那么 Verdigris 就是你所需要的:

[你]需要一个可以执行 C++14 宽松 constexpr 的编译器,例如 GCC 5.1 或 Clang 3.5,或 MSVC 2017

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-27
    • 1970-01-01
    相关资源
    最近更新 更多