我们可以将 Q_PROPERTY 与 template<typename T> 一起使用吗?

Posted

技术标签:

【中文标题】我们可以将 Q_PROPERTY 与 template<typename T> 一起使用吗?【英文标题】:Can we use Q_PROPERTY with template<typename T>? 【发布时间】:2016-07-14 10:29:08 【问题描述】:

我想使用 QML 和 C++ 在我的 GUI 上显示template &lt; typename T&gt; 类型的多数据类型值。是否可以将它与Q_PROPERTY 一起使用,或者我应该对每种数据类型使用函数重载并将其传递给Q_PROPERTY

例如:

Q_PROPERTY(int dataread READ dataRead NOTIFY dataChanged)
Q_PROPERTY(float dataread READ dataRead NOTIFY dataChanged)
int dataRead (int data) return data; 
float dataRead (float data) return data; 

【问题讨论】:

【参考方案1】:

不,您不能使用带有属性的模板,因为 moc 不支持模板。这已经被讨论过(并且是可行的),但没有足够的兴趣来实施它。

每个属性还标识一个具体类型,因此您也不能重载它。你可以重载信号和槽,所以这是可行的:

class foo : public QObject

    Q_OBJECT
    Q_PROPERTY(int intRead READ readInt NOTIFY dataChanged)
    Q_PROPERTY(float floatRead READ readFloat NOTIFY dataChanged)

public:
    int readInt() return data; 
    float readFloat() return data; 
signals:
    void dataChanged(int data);
    void dataChanged(float data);
...

请注意,我从您的读取函数中删除了参数。

【讨论】:

dataRead 没有意义,你不能重载返回类型。我也会避免重载信号,因为您将面临 PMF 连接语法的问题。

以上是关于我们可以将 Q_PROPERTY 与 template<typename T> 一起使用吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Qt 属性与自定义类一起使用?

来自其他 QThread 的 Q_PROPERTY 将变量发送到 QML

Q_PROPERTY 未显示

为啥我不能拥有带有此签名的 Q_PROPERTY?

如何有效地将单个对象的多个 C++ 数据成员公开给 QML?

C++ 成员变量类 Q_PROPERTY 在 QML 中不可用