首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Qt多重继承和信号

Qt多重继承和信号
EN

Stack Overflow用户
提问于 2011-03-23 10:27:38
回答 3查看 7.2K关注 0票数 7

由于QObject,我对QT中的多重遗传有问题。我知道很多人都有同样的问题,但我不知道该如何解决。

代码语言:javascript
运行
复制
class NavigatableItem : public QObject
{
    Q_OBJECT

    signals:
        void deselected();
        void selected();
        void activated();
};

class Button : public NavigatableItem, public QToolButton
{
    Q_OBJECT

    ...
}

class MainMenuOption : public Button
{
    Q_OBJECT

    ...
}

当我这么做的时候

代码语言:javascript
运行
复制
MainMenuOption* messages = new MainMenuOption();
connect(messages, SIGNAL(selected()), SLOT(onMenuOptionSelected()))

我会得到错误:

QObject是MainMenuOption的一个模棱两可的基

我让NavigatableItem离开QObject的原因是因为信号。有办法这样做吗?

编辑:

将虚拟添加到每个继承声明中,仍然会给出相同的错误:

代码语言:javascript
运行
复制
class NavigatableItem : public virtual QObject

class Button : public virtual NavigatableItem, public virtual QToolButton

class MainMenuOption : public virtual Button

即使在“清除所有”、“运行qmake”和“构建所有”之后也是如此。

EN

Stack Overflow用户

回答已采纳

发布于 2011-03-23 12:48:08

它需要更多的代码,但我过去所做的是将其中一个(在本例中是您的NavigatableItem )变成一个纯虚拟类,即接口。而不是使用“信号”宏,使它们成为纯粹的虚拟保护函数。然后从QObject派生类以及接口继承乘法,并实现这些方法。

我知道这有点有争议,但是不惜一切代价避免多重实现继承确实解决了许多问题和混乱。谷歌C++风格指南建议这样做,我认为这是个很好的建议。

代码语言:javascript
运行
复制
class NavigatableItemInterface
{
    // Don't forget the virtual destructor!
    protected:
        virtual void deselected() = 0;
        virtual void selected() = 0;
        virtual void activated() = 0;
};

class Button : public NavigatableItemInterface, public QToolButton
{
    Q_OBJECT
    ...
    signals:
        virtual void deselected();
        ...
}
票数 8
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5403810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档