首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QT :模板化Q_OBJECT类

QT :模板化Q_OBJECT类
EN

Stack Overflow用户
提问于 2010-12-09 19:00:43
回答 4查看 28.1K关注 0票数 51

有没有可能有一个模板类,它继承自QObject (并在声明中包含Q_OBJECT宏)?

我想为插槽创建适配器,它可以做一些事情,但是插槽可以接受任意数量的参数(参数的数量取决于模板参数)。

我只是试着这样做,但得到了链接器错误。我猜这个模板类没有调用gmake或moc。有没有办法做到这一点?也许是通过显式实例化模板?

EN

回答 4

Stack Overflow用户

发布于 2013-10-02 22:09:43

不可能混合模板和Q_OBJECT,但如果您有类型的子集,您可以像这样列出插槽和信号:

代码语言:javascript
复制
    class SignalsSlots : public QObject
    {
        Q_OBJECT

    public:
        explicit SignalsSlots(QObject *parent = 0) :
            QObject(parent) {}

    public slots:
        virtual void writeAsync(int value) {}
        virtual void writeAsync(float value) {}
        virtual void writeAsync(double value) {}
        virtual void writeAsync(bool state) {}
        virtual void writeAsync(svga::SSlideSwitch::SwitchState state) {}   

    signals:
        void readAsynkPolledChanged(int value);
        void readAsynkPolledChanged(float value);
        void readAsynkPolledChanged(double value);
        void readAsynkPolledChanged(bool state);
        void readAsynkPolledChanged(svga::SSlideSwitch::SwitchState state);
    };
...
template <class T>
class Abstraction : public SignalsSlots
{...
票数 42
EN

Stack Overflow用户

发布于 2012-03-02 23:17:04

考虑到一些限制:你可以。首先,请熟悉(如果还不熟悉) https://doc.qt.io/archives/qq/qq16-dynamicqobject.html。-这将有助于它的实施。关于限制:您可以拥有一个模板QObject类,即从QObject派生的模板类,但是:

  1. 不要告诉moc编译它。
  2. Q_OBJECT只是一个宏,你必须用它来替换它:)
  3. 实现QMetaObject激活(上面提到的虚拟接口和对象信息数据要小心,它也来自Q_OBJECT)和一些其他功能,您将拥有template QObject (即使带有模板插槽)
  4. ,但由于我设法抓住了一个缺点-它不可能简单地将这个类用作另一个类的基类。
  5. 还有一些其他缺点-但我认为详细调查会告诉您这些缺点。

希望这能对你有所帮助。

票数 12
EN

Stack Overflow用户

发布于 2017-06-29 14:01:56

它仍然不可能混合模板和连接,但根据你的用例,你可以使用新的‘Q_OBJECT’语法。这至少允许使用模板槽。

经典的非工作方法:

代码语言:javascript
复制
class MySignalClass : public QObject {
  Q_OBJECT
public:

signals:
  void signal_valueChanged(int newValue);
};     


template<class T>
class MySlotClass : public QObject {
  Q_OBJECT
public slots:
  void slot_setValue(const T& newValue){ /* Do sth. */}
};

所需的用法,但不可编译:

代码语言:javascript
复制
MySignalClass a;
MySlotClass<int> b;

QObject::connect(&a, SIGNAL(signal_valueChanged(int)),
                 &b, SLOT(slot_setValue(int)));

错误: Q_OBJECT不支持模板类(用于MySlotClass)。

使用新的‘’的连接解决方案-语法:

代码语言:javascript
复制
// Nothing changed here
class MySignalClass : public QObject {
  Q_OBJECT
public:

signals:
  void signal_valueChanged(int newValue);
};


// Removed Q_OBJECT and slots-keyword
template<class T>
class MySlotClass : public QObject {  // Inheritance is still required
public:
  void slot_setValue(const T& newValue){ /* Do sth. */}
};

现在我们可以实例化所需的“MySlotClass”对象,并将它们连接到适当的信号发射器。

代码语言:javascript
复制
  MySignalClass a;
  MySlotClass<int> b;

  connect(&a, &MySignalClass::signal_valueChanged,
          &b, &MySlotClass<int>::slot_setValue);

结论:使用模板插槽的是可能的。发出模板信号不起作用,因为由于缺少Q_OBJECT将发生编译器错误。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4397478

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档