当我尝试连接BASE类信号时,Qt告诉我DERIVED类上不存在信号。
为什么?如何告诉connect使用BASE类?
namespace MyNamespace
{
void register(Derived* derived)
{
// ERROR MSG
// QObject::connect: No such signal MyNamespace::Derived::baseSignal()
QObject::connect( derived, SIGNAL(baseSignal()),
foo, SLOT(fooSlot()));
}
class Base : public QObject
{
Q_OBJECT
signals:
void baseSignal();
};
class Derived : public QObject,
public Base
{
Q_OBJECT
signals:
void derivedSignal();
};
} // namespace MyNamespace
答案 0 :(得分:5)
您的问题是,您从Derived
多次派生QObject
:您通过Base
类直接从和派生出来。不要这样做,因为Qt不支持QObject
的多个派生,甚至不支持虚拟派生。
QObject
系统会忽略第二个及后续QObject
个基数。因此,对于QObject
机制,Derived
类仅来自QObject
,而不是来自Base
- 因此它不知道baseSignal
。正如他们应该的那样,因为多个QObject
派生的支持会产生运行时开销 - 无论如何,你需要实际上继承QObject
,你甚至都没有这样做! / p>
至少,如果您希望这样做,您的代码需要如下所示:
class Base : public virtual QObject { ... };
class Derived : public Base, public QObject { ... };
......但是Qt不支持。
如果你编写Derived
类来首先继承基类,那你就更幸运了:
class Base : public QObject { ... };
class Derived : public Base, public QObject { ... };
虽然第二个QObject
基础毫无意义并被QObject
机制忽略,但这样做会有效。
答案 1 :(得分:1)
这种形式会好得多:
namespace MyNamespace
{
class Base : public QObject
{
Q_OBJECT
signals:
void baseSignal();
};
class Derived : public Base
{
Q_OBJECT
signals:
void derivedSignal();
};
void registerX( Derived* derived )
{
QObject::connect( derived, SIGNAL(baseSignal()), foo, SLOT(fooSlot()));
}
} // namespace MyNamespace
正如this post所说,你不会多次继承QObject。