3

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

class MyListener : public QObject
{
    Q_OBJECT
};

class MyDialog : public QDialog, public MyListener
{
    Q_OBJECT
};

这导致了以下编译错误:

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

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

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

4

3 回答 3

4

做了:

class MyDialog : public QDialog
{
    Q_OBJECT

    public:
    MyListener& listener() { return m_listener; }

    private:
    MyListener m_listener;
};
于 2013-11-06T17:50:00.227 回答
2

您是否考虑过继承您的QObjectas protected ?这是因为两个类都使用该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
};
于 2013-11-06T17:33:45.510 回答
1

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

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

最重要的是,文档说

支持使用 QObject 进行虚拟继承。

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

于 2013-11-06T17:46:47.420 回答