我想在不同的类之间共享信号和可能的插槽实现,但似乎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问题
你不能做这个。 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
类。我自己没有尝试过,因此不知道它是否真的允许多重继承。可能值得研究。
为什么不将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;
};
这不适合你吗?