派生 QMainWindow 并更改其布局

Posted

技术标签:

【中文标题】派生 QMainWindow 并更改其布局【英文标题】:Derive QMainWindow and change its layout 【发布时间】:2014-10-17 23:01:52 【问题描述】:

我在自定义QMainWindow时遇到了一个大问题,因为我不知道如何实现以下内容:

QMainWindow 文档中,QMainWindow 具有一些用于工具栏、停靠小部件、状态栏和其他的特殊区域:

现在我想要的是为新的自定义类型的小部件提供一个新的自定义区域,例如:

我尝试派生 QWidget 并将我的自定义小部件放在上面,并在其下方放置一个 QMainWindow 但使用此方法我必须将所有标准 QMainWindow 方法从我的 QWidget 重定向到它的 QMainWindow 孩子,这是非常不方便。

我的问题是:是否可以自定义QMainWindow 布局并在标准布局中添加一个额外的区域,如上图中的Custom Widget 区域?

【问题讨论】:

【参考方案1】:

我有两个消息要告诉你:坏消息和好消息。

坏消息:QMainWindow 使用 QMainWindowLayout,它是 Qt 私有标头的一部分,因此您无法按原样“诚实地”自定义布局。

但你仍然可以做到。有一个QMainWindow::setMenuWidget 方法对您有用。如果你的主窗口没有菜单栏,那么你可以简单地写

setMenuWidget(myCustomWidget);

myCustomWidget 将被放置在窗口的顶部。

但是,如果您的应用中有菜单栏,那就没那么容易了。但即使在这种情况下,您仍然可以在窗口顶部放置一个由两部分组成的小部件:上方的自定义小部件和下方的菜单栏。例如对于 QtDesigner 生成的窗口,可以如下完成:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)

    ui->setupUi(this);
    QLabel *coolLabel = new QLabel("The coolest text in the world", this);
    QWidget *menuWidget = new QWidget;
    QVBoxLayout *vLayout = new QVBoxLayout;
    menuWidget->setLayout(vLayout);
    vLayout->addWidget(coolLabel);
    vLayout->addWidget(ui->menuBar);
    setMenuWidget(menuWidget);

【讨论】:

以上是关于派生 QMainWindow 并更改其布局的主要内容,如果未能解决你的问题,请参考以下文章

Qt ------ 初始化构造函数参数,parent

对于 QMainWindow,我如何才能拥有更多的 UI?

是否可以使用其基类构造函数创建派生类的指针而不修改派生类的布局?

在Qt中手动设置窗口布局的正确方法

如何使用自动调整大小和自动布局并更改其默认行为? [关闭]

powershell 获取位于“页面”库中的所有页面并更改其页面布局。