2

我在定制方面遇到了很大的问题,QMainWindow因为我不知道如何实现以下目标:

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

在此处输入图像描述

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

在此处输入图像描述

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

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

4

1 回答 1

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);
}
于 2014-10-19T12:14:48.463 回答