导出QMainWindow并更改其布局

时间:2014-10-17 23:01:53

标签: c++ qt qwidget qmainwindow qlayout

我在定制QMainWindow时遇到了一个大问题,因为我不知道如何实现以下功能:

QMainWindow文档中,QMainWindow显示为工具栏,停靠窗口小部件,状态栏等具有一些特殊区域:

enter image description here

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

enter image description here

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

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

1 个答案:

答案 0 :(得分: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);
}