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中的多重继承的主要内容,如果未能解决你的问题,请参考以下文章