派生 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 并更改其布局的主要内容,如果未能解决你的问题,请参考以下文章