QObject的多重继承

Posted

技术标签:

【中文标题】QObject的多重继承【英文标题】:Multiple inheritance of QObject 【发布时间】:2013-11-06 17:30:01 【问题描述】:

我有一个类可以通过连接到几个不同上下文中的某些信号来监听,还有一个对话框可以进行上述监听。

class MyListener : public QObject

    Q_OBJECT
;

class MyDialog : public QDialog, public MyListener

    Q_OBJECT
;

导致以下编译错误:

错误:对“连接”的引用不明确

我怀疑这可能是由MyDialog对引起的,一次通过QDialog,一次通过MyListener。但是,将上述所有继承语句都设为虚拟并不能消除错误。

您能建议这可能是什么原因吗?

【问题讨论】:

您使用的是 4.8 版还是 5.1.1 版? 【参考方案1】:

制作:

class MyDialog : public QDialog

    Q_OBJECT

    public:
    MyListener& listener()  return m_listener; 

    private:
    MyListener m_listener;
;

【讨论】:

【参考方案2】:

您是否考虑过将 QObject 继承为受保护的?这是因为这两个类都使用 connect() 函数将 .ui 文件中的插槽和信号连接在一起,让每个类相互继承意味着您现在有两个可能的连接函数,只要程序调用连接您的信号/插槽

保护你需要的函数,防止两个connect()的歧义

class MyListener

    public:
        //...
    protected:
        int a;
        //stuff to share
;

class MyDialog: public QDialog, protected MyListener 


    //has access to all protected members but not the private members
;

【讨论】:

【参考方案3】:

将上述所有继承语句设为虚拟并不能消除错误。

这是意料之中的,因为virtual 关键字只影响直接基类。也就是说,MyListener 仍然以非虚拟方式继承 QObject。你无法真正改变这一点。

最重要的是,文档说

不支持使用 QObject 的虚拟继承

唯一合理的解决方案是让MyListener继承QObject

【讨论】:

以上是关于QObject的多重继承的主要内容,如果未能解决你的问题,请参考以下文章

QObject 多重继承

QObject的多重继承

为啥在多重继承的情况下QObject需要是第一个

C++ 中 QObject 多重继承和策略/特征设计的问题

Qt中图元对象的多重集成

Qt 多重继承和信号