Qt信号时隙重复码避免

时间:2019-04-09 11:04:21

标签: c++ qt inheritance signals-slots qobject

我想在不同的类之间共享信号以及可能的插槽实现,但是Qt似乎不允许这样做。

基本上我想拥有这样的东西:

class CommonSignals
  {
  signals:
  void mysignal();
  };

class A : 
    public QObject, 
    public CommonSignals
  {
    Q_OBJECT
  public:
    void doSomething()
      {
      emit mysignal();
      }
  };


class B : 
    public QObject, 
    public CommonSignals
  {
    Q_OBJECT

  public:

    B()
      {
      connect(&a, &A::mysignal, this, &B::mysignal);
      }

    A a;
  };

因此,由于某种原因,A发出信号B也会发出相同信号。这样可以避免无用的代码复制并提高可维护性。

有什么想法吗?

我也尝试了虚拟继承的PS,但是我遇到了经典的qmake问题

2 个答案:

答案 0 :(得分:3)

您不能这样做。 QObject不能与多个QObject基的多重继承一起使用。只有第一个继承的类可以是QObject。参见:

https://doc.qt.io/qt-5/moc.html#multiple-inheritance-requires-qobject-to-be-first

由于您需要两个基类都为QObjectCommonSignals提供信号,因此必须为QObject),所以您很不走运。您唯一的选择是使用普通的旧宏:

#define COMMON_SIGNALS \
    void signal1(); \
    void signal2();

class A: public QObject
{
    Q_OBJECT

public:
    // ...

signals:
    COMMON_SIGNALS
};

class B: public QObject
{
    Q_OBJECT

public:
    // ...

signals:
    COMMON_SIGNALS
};

所有这些的核心问题是Qt使用moc生成信号和时隙的基础代码。但是,moc只是一个简单的预处理器,无法理解大多数C ++。

您可以使用Verdigris去除moc:

https://github.com/woboq/verdigris

例如,这允许您使用模板化QObject类。我自己没有尝试过,因此不知道它是否真正允许多重继承。可能值得研究。

答案 1 :(得分:1)

为什么不将QObject的继承从派生类AB移到CommonSignals ...

class CommonSignals: public QObject {
  Q_OBJECT;
signals:
  void mysignal();
};

class A: public CommonSignals {
  Q_OBJECT;
public:
  void doSomething ()
    {
      emit mysignal();
    }
};

class B: public CommonSignals {
  Q_OBJECT;
public:
  B ()
    {
      connect(&a, &A::mysignal, this, &B::mysignal);
    }
  A a;
};

这对您不起作用吗?