无法连接基类信号

时间:2015-07-16 20:54:56

标签: c++ qt

当我尝试连接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

2 个答案:

答案 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。