【问题标题】:Cannot connect signal from base class无法连接来自基类的信号
【发布时间】:2015-10-06 11:56:18
【问题描述】:

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

【问题讨论】:

  • 如果我在 connect() 中将发件人转换为 Base *,我会得到同样的错误。
  • Derived 包含derivedSignal(),而不是baseSignal()。您告诉 Qt 连接到 baseSignal() 但传递一个 Derived 作为它应该查找该函数的对象。如果将 Base * 传递给 register() 会发生什么?
  • 我试图编译它。有一条警告消息告诉我 Derive 不应该从 QObject 继承,因为 base 已经从那里继承了。
  • 如果我在 connect() 中将发件人转换为 Base *,我会得到同样的错误。
  • 而register是关键字,所以你应该再找一个词。

标签: c++ qt


【解决方案1】:

您的问题是您从QObject 乘以派生Derived:您直接从它派生通过Base 类。不要那样做,因为 Qt 不支持从QObject 进行多重派生,甚至不支持虚拟派生。

QObject 系统会忽略第二个和后续的 QObject 碱基。因此,对于QObject 机器,Derived 派生自 QObject,而不是派生自 Base - 因此它不知道 baseSignal。应该如此,因为支持多个 QObject 派生会产生运行时开销 - 无论如何,您实际上需要继承 QObject,而您甚至没有这样做!

如果您希望这样可以工作,您的代码至少需要如下所示:

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 机器忽略,但这会起作用。

【讨论】:

    【解决方案2】:

    这种形式会好很多:

    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。

    【讨论】:

    • 同意。基类和派生类不应同时从 QObject 派生。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    • 2016-10-11
    • 2020-07-09
    • 1970-01-01
    相关资源
    最近更新 更多