我想在不同的类之间共享信号以及可能的插槽实现,但是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问题
答案 0 :(得分:3)
您不能这样做。 QObject
不能与多个QObject
基的多重继承一起使用。只有第一个继承的类可以是QObject
。参见:
https://doc.qt.io/qt-5/moc.html#multiple-inheritance-requires-qobject-to-be-first
由于您需要两个基类都为QObject
(CommonSignals
提供信号,因此必须为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
的继承从派生类A
和B
移到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;
};
这对您不起作用吗?