首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QMdiSubWindow在QSplitter中的最大化

QMdiSubWindow在QSplitter中的最大化
EN

Stack Overflow用户
提问于 2022-03-12 11:56:14
回答 1查看 197关注 0票数 1

我将QSplitter设置为中心部件:

代码语言:javascript
复制
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent),
      mdiArea(new QMdiArea)
{
    QWidget *widget = new QWidget;
    widget->setMinimumSize(100, 100);

    QSplitter *splitter = new QSplitter;
    splitter->addWidget(mdiArea);
    splitter->addWidget(widget);

    setCentralWidget(splitter);

    createActions();
}

void MainWindow::createSubwin()
{
    QWidget *subwin = new QWidget(mdiArea);
    subwin->setWindowTitle("Subwindow");
    subwin->setMinimumSize(100, 100);
    mdiArea->addSubWindow(subwin);

    subwin->show();
}

void MainWindow::createActions()
{
    QAction *actSub = new QAction("Add subwindow", this);
    connect(actSub, SIGNAL(triggered()), SLOT(createSubwin()));

    QMenu *winMenu = menuBar()->addMenu("Windows");
    winMenu->addAction(actSub);
}

当我按下子窗口的最大化按钮时,子窗口覆盖整个主窗口。有没有办法阻止这种行为,让子窗口占据QMdiArea的所有空间呢?

UPD:看起来只有当主窗口的QMenuBar中至少有一个菜单时,问题才会发生。没有menuBar,一切都如预期的那样工作:

https://www.qtcentre.org/threads/44457-QMdiSubWindow-maximizing-problem

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-12 13:18:57

关于QSplitter,我给了OP以下提示:

QSplitter的右侧移动到一个停靠小部件中(并删除QSplitter),因此左部分是QMainWindow::centralWidget()的唯一部分。这意味着使用现有的类而不是相反的类,并且可能更容易管理。

OP欣赏了码头小部件的提示,但声称子窗口仍将占据整个主窗口。

我必须承认我在MDI方面缺乏经验,我做了一个MCVE来证明我自己是对还是错:

代码语言:javascript
复制
#include <QtWidgets>

// main application

int main(int argc, char **argv)
{
  qDebug() << "Qt Version:" << QT_VERSION_STR;
  QApplication app(argc, argv);
  // setup GUI
  QMainWindow qWinMain;
  qWinMain.setWindowTitle("QMainWindow - MDI - Dock");
  qWinMain.resize(640, 480);
  // MDI
  QMdiArea qMDI;
  qWinMain.setCentralWidget(&qMDI);
  // MDI sub widget
  QLabel qWinSub("MDI Sub-Window\nwidget");
  qMDI.addSubWindow(&qWinSub);
  // Dock
  QDockWidget qDock;
  qDock.setWindowTitle("Dock");
  QLabel qLblDock("Dock\nwidget");
  qDock.setWidget(&qLblDock);
  qWinMain.addDockWidget(Qt::RightDockWidgetArea, &qDock);
  qWinMain.show();
  // runtime loop
  return app.exec();
}

输出:

所以,我不能重复行动的说法-它在我这边有效。

我的平台: Windows 10,VS2019,Qt5.15

我对第一个MCVE做了一点改进,看看如果MDI子窗口是在qWinMain.show()之后创建的(这是通常的情况),它是如何工作的。

代码语言:javascript
复制
#include <QtWidgets>

// main application

int main(int argc, char **argv)
{
  qDebug() << "Qt Version:" << QT_VERSION_STR;
  QApplication app(argc, argv);
  // setup GUI
  QMainWindow qWinMain;
  qWinMain.setWindowTitle("QMainWindow - MDI - Dock");
  qWinMain.resize(640, 480);
  // MDI
  QMdiArea qMDI;
  qWinMain.setCentralWidget(&qMDI);
  // Dock
  QDockWidget qWinDock;
  qWinDock.setWindowTitle("Dock");
  QWidget qDock;
  QVBoxLayout qVBoxDock;
  QPushButton qBtnNewMDISubWin("New Sub-Window");
  qVBoxDock.addWidget(&qBtnNewMDISubWin);
  qDock.setLayout(&qVBoxDock);
  qWinDock.setWidget(&qDock);
  qWinMain.addDockWidget(Qt::RightDockWidgetArea, &qWinDock);
  // create sub-window
  int i = 0;
  auto createSubWin = [&]() {
    ++i;
    QLabel* pQWinSub = new QLabel(QString("MDI Sub-Window\nwidget %1").arg(i));
    pQWinSub->setWindowTitle(QString("MDI Sub-Window %1").arg(i));
    qMDI.addSubWindow(pQWinSub);
    pQWinSub->show();
  };
  // install signal handlers
  QObject::connect(&qBtnNewMDISubWin, &QPushButton::clicked,
    createSubWin);
  // runtime loop
  qWinMain.show();
  return app.exec();
}

输出:

它仍然像我所期望的那样对我起作用。

注:

我必须在pQWinSub->show();之后添加显式qMDI.addSubWindow(pQWinSub); (这在第一个MCVE中是不必要的)。然而,OP的代码正是这样做的。

执行部分答复:

结果表明,只有当menuBar存在时才会出现问题

奥哈。怎么来的?

我再次扩展了MCVE以添加菜单栏:

代码语言:javascript
复制
#include <QtWidgets>

// main application

int main(int argc, char **argv)
{
  qDebug() << "Qt Version:" << QT_VERSION_STR;
  QApplication app(argc, argv);
  // setup GUI
  QMainWindow qWinMain;
  qWinMain.setWindowTitle("QMainWindow - MDI - Dock");
  qWinMain.resize(640, 480);
  // menu
  QMenuBar qMenuMain;
  QAction qCmdFile("File");
  QMenu qMenuFile;
  QAction qCmdFileNew("New");
  qMenuFile.addAction(&qCmdFileNew);
  qCmdFile.setMenu(&qMenuFile);
  qMenuMain.addAction(&qCmdFile);
  qWinMain.setMenuBar(&qMenuMain);
  // MDI
  QMdiArea qMDI;
  qWinMain.setCentralWidget(&qMDI);
  // Dock
  QDockWidget qWinDock;
  qWinDock.setWindowTitle("Dock");
  QWidget qDock;
  QVBoxLayout qVBoxDock;
  QPushButton qBtnNewMDISubWin("New Sub-Window");
  qVBoxDock.addWidget(&qBtnNewMDISubWin);
  qDock.setLayout(&qVBoxDock);
  qWinDock.setWidget(&qDock);
  qWinMain.addDockWidget(Qt::RightDockWidgetArea, &qWinDock);
  // create sub-window
  int i = 0;
  auto createSubWin = [&]() {
    ++i;
    QLabel* pQWinSub = new QLabel(QString("MDI Sub-Window\nwidget %1").arg(i));
    pQWinSub->setWindowTitle(QString("MDI Sub-Window %1").arg(i));
    pQWinSub->setFrameShape(QFrame::Box);
    qMDI.addSubWindow(pQWinSub);
    pQWinSub->show();
  };
  // install signal handlers
  QObject::connect(&qCmdFileNew, &QAction::triggered,
    createSubWin);
  QObject::connect(&qBtnNewMDISubWin, &QPushButton::clicked,
    createSubWin);
  // runtime loop
  qWinMain.show();
  return app.exec();
}

输出:

注:

我部分同意“任择议定书”:

是的,最大化MDI的外观现在有点不同了。看起来它占据了主窗口的整个客户区域,但是…。

…停靠小部件仍然可见。我向QLabel ( MDI子窗口中的顶部小部件)添加了一个框来说明这一点。事实上,子窗口仍然只占据中心部件(不管标题栏的外观如何)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71449494

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档