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

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

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

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

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

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

【问题讨论】:

    标签: c++ qt qwidget qmainwindow qlayout


    【解决方案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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-10
      • 1970-01-01
      • 2013-11-27
      • 2010-09-20
      • 1970-01-01
      • 2023-03-14
      相关资源
      最近更新 更多