无法连接基类信号

Oct*_*cto 3 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
Run Code Online (Sandbox Code Playgroud)

Rei*_*ica 5

你的问题是,你乘获得Derived来自QObject:你从它直接产生,并通过Base类.不要这样做,因为Qt不支持多个派生QObject,甚至不支持虚拟派生.

系统QObject忽略第二个和后续的基数QObject.因此,对于QObject机器来说,这个Derived阶级只是来自QObject而不是来自Base- 因此它不知道baseSignal.他们应该是这样,因为多次QObject派生的支持会导致运行时开销 - 无论如何,你需要实际上继承QObject,而你甚至都没有这样做!

至少,如果您希望这样做,您的代码需要如下所示:

class Base : public virtual QObject { ... };
class Derived : public Base, public QObject { ... };
Run Code Online (Sandbox Code Playgroud)

......但Qt不支持这一点.

如果您编写Derived类以首先继承基类,那么您会更幸运:

class Base : public QObject { ... };
class Derived : public Base, public QObject { ... };
Run Code Online (Sandbox Code Playgroud)

虽然第二个QObject基地毫无意义并被QObject机器忽视,但这本来是有效的.