Qt中的多重继承

Posted

技术标签:

【中文标题】Qt中的多重继承【英文标题】:Multiple inheritance in Qt 【发布时间】:2017-01-10 04:59:32 【问题描述】:

如何也继承QLabel和QPushButton,我试过的显示错误信息

/home/test.cpp:206: error: reference to 'setText' is ambiguous
      setText(text);
      ^

这是我尝试过的:

class virtualLabel: virtual public QLabel

    Q_OBJECT
public:
    explicit virtualLabel(const QString& text="", QWidget* parent=0)
    ~virtualLabel()

;

class virtualPushButton: virtual public QPushButton

    Q_OBJECT
public:
    explicit virtualPushButton(const QString& text="", QWidget* parent=0)
    ~virtualPushButton()

;



class customLabel : public virtualLabel, public virtualPushButton

    Q_OBJECT
    // Q_DECLARE_INTERFACE
    //Q_INTERFACES(YourInterface OtherInterface)


public:
    explicit customLabel(const QString& text="", QWidget* parent=0);
    ~customLabel();

    QString folderName;

;

感谢您的帮助

【问题讨论】:

C 和 C++ 是不同的语言。请仅使用相关标签。 你想完成什么?看起来您想要一个也是标签的按钮?如果是这样,根本不要打扰 QLabel,只需使用(或子类) QPushButton 并在其上调用 setText() 来设置其标签。一般来说,使用多重继承从多个 QObject 子类继承是一个坏主意。 我想在单个对象上使用 QPushButton 和 QLabel 的所有信号和插槽@Jeremy Friesner @jeremyfriesner 从多个 QObject 子类继承不仅是个坏主意,而且不受支持。 【参考方案1】:

你没有。

除了模棱两可的问题之外,您还会遇到更多问题。

来自moc 上的 Qt 文档:

不支持使用 QObject 的虚拟继承

(相信他们)

而是使用组合并公开您需要的信号、槽和函数。

class customLabel : public QWidget

    Q_OBJECT
public:
    explicit customLabel(const QString& text="", QWidget* parent=0);
    ~customLabel();
protected:
    QPushButton* button;
    QLabel* label;
;

【讨论】:

这不起作用的一个原因是共享 QObject 的元信息冲突,Label 和 Button 共享。可怕的钻石! @jens 似乎您的评论适用于这个问题,而不是这个答案? 嗯,我需要创建一个实体,它同时拥有 qlable 和 qpushbutton 的属性,有没有其他方法可以做到, 请注意,两个子小部件都可以按值保存。没有理由通过指针保留它们。 @Schollii:这是对“相信他们”的评论。我想解释一下为什么答案是正确的,你不应该在任何 QObject 派生类上使用多个虚拟继承。

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

使用具有多重继承的 Qt 信号和槽

来自两个抽象类的多重继承 (Qt)

Qt、多重继承、包装器或事件过滤器

Qt中图元对象的多重集成

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

java中的多重继承是啥意思?