类QLayout和类QMainWindow Qt c++之间的继承

Posted

技术标签:

【中文标题】类QLayout和类QMainWindow Qt c++之间的继承【英文标题】:Inheritance between class QLayout and class QMainWindow Qt c++ 【发布时间】:2018-06-22 09:57:17 【问题描述】:

我有一个继承自 QMainWindow 的 MainWindow 类。我有另一个继承自 QLayout 的 LayoutWindow 类。 当我声明一个 LayoutWindow 类的实例时,我有一个错误:

错误:抽象类类型的无效新表达式 ...

我不明白,因为 QMainWindow 继承自 QWidget,而 QWidget 继承自 QLayout?

这是我的代码:

类主窗口:

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
//instance class LayoutWindow
layoutwindow=new LayoutWindow();

centralArea = new QWidget;
centralArea->setLayout(layoutwindow);
setCentralWidget(centralArea);

类 LayoutWindow.h

class LayoutWindow : public QLayout

Q_OBJECT

public:
LayoutWindow();
;

类 LayoutWindow.cpp

LayoutWindow::LayoutWindow()

 //here is my code

有人知道我的问题吗?

【问题讨论】:

QLayout 确实是一个抽象类。如果不在那里实现纯虚函数,就无法实例化 LayoutWindow 类对象。并且QWidget 不继承任何其他类。 Here 是关于在子类化 QLayout 时要做什么的快速入门。不过,根据我的经验,Qt 附带的现有 QLayout 子类适合/可组合满足许多需求,但我无法判断您的特定应用程序。 【参考方案1】:

QLayout 具有纯虚方法,您必须在要实例化的子类中实现这些方法。

这些是

void addItem(QLayoutItem *item);
int count() const;
QLayoutItem * itemAt(int index) const;
QLayoutItem * takeAt(int index);

您断言QWidget 继承QLayout 是错误的,它继承自QObjectQPaintDevice,两者都没有基类。 QWidget 有一个布局member,用于排列子小部件。

我也不认为您需要派生自QLayout 的类。您应该使用现有布局和小部件类型的 对象 组合来排列窗口。作为 QT 安装的一部分,您应该拥有一个用于可视化设计窗口的工具 QDesigner.exe

【讨论】:

我想保持相同的MainWindow,但根据界面中选择的功能,我想更改MainWindow内部的布局。这就是为什么我希望有不同的类来管理布局。 @Thomas1314 如果您只想在运行时添加或删除子小部件,您可以在没有自定义 QLayout 子类的情况下执行此操作。如果您有完全不同的小部件集,请参阅QStackedWidget 感谢您的回答。如果我理解正确的话。我创建了继承自 QStackedWidget 的 LayoutWindow 类。我在 MainWindow 类中调用这个类,然后显示我的按钮、标签……就这样? 不,你根本没有LayoutWindowMainWindow 可能有一个 member QStackedWidget *,它将各种子小部件添加到其中。我强烈鼓励您学习 Qt 可视化设计工具来制作静态表单,它们会为您完成所有繁琐的设置。查看 Qt 示例程序

以上是关于类QLayout和类QMainWindow Qt c++之间的继承的主要内容,如果未能解决你的问题,请参考以下文章

Qt学习笔记3.布局

Qt不同类之间如何emit信号进行触发操作?

C ++ QT如何从QMainWindow布局访问QWidget的公共类成员

QT。向 QLayout 添加新布局

Qt - 如何控制 QLayout 中的小部件大小

Qt布局