Qt信号槽复制码避免

问题描述 投票:1回答:2

我想在不同的类之间共享信号和可能的插槽实现,但似乎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问题

c++ qt inheritance signals-slots qobject
2个回答
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
投票

为什么不将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;
};

这不适合你吗?

© www.soinside.com 2019 - 2024. All rights reserved.