1

情况:作为我的应用程序的中心小部件,我有一个处于选项卡模式的QMdiArea (包装在从QMdiArea继承的自定义类中)。当我现在通过一切添加第一个QMdiSubWindowaddSubWindow()时,一切都很好,这意味着窗口及其内容被最大化以占用QMdiArea的所有空间。但是,一旦我添加了第二个子窗口,就会出现以下问题:

问题:第二个窗口的内容没有显示,而是第一个窗口的内容继续显示(尽管第二个选项卡在视觉上具有焦点),但尺寸减小了。它只占用几个像素。但是,如果我现在切换回第一个子窗口/选项卡(通过单击缩小尺寸的小部件,然后自动返回到最大尺寸或通过选择第一个选项卡标题),然后再次选择第二个,一切都很好 =第二个选项卡的小部件/编辑器现在显示并最大化。

但直到我关闭第二个选项卡,在这种情况下,第一个选项卡的内容才会显示(如预期的那样),但同样只能以小尺寸显示!

截屏: 概述问题的屏幕截图

另一个相关的测试用例:创建第一个选项卡并按预期显示全尺寸。如果我现在简单地调整整个QMainWindow的大小,我的选项卡中的小部件周围会突然出现一个模糊的边框。因此,它似乎处于最大化模式和带边框的正常模式之间的混合状态。这会产生任何新的潜在客户吗?

截屏:

概述相关问题的屏幕截图

到目前为止,我没有使用任何明确定义的布局,但鉴于第一个选项卡工作正常,并且在手动来回切换所有其他选项卡之后,我认为它应该可以不使用。

我需要设置显式布局对象吗?为什么它适用于第一个选项卡,而不适用于第二个?

一些代码作为基础:这是在我的自定义QMdiArea类中执行的逻辑,负责添加新的孩子:

// Note: pEditor inherits from / is a QMdiSubWindow itself

if(!pEditor->isInitialized())
{
    pEditor->initialize();
    pEditor->setWidget(pEditor->getEditorWidget()); 
    pEditor->setInitialized(true);
}

pEditor->beforeDisplay();

addSubWindow(pEditor);
pEditor->showMaximized();

// HACK START
pExisting = subWindowList().at(0);
if(pExisting)
    setActiveSubWindow(pExisting);
// HACK END 

更新:添加了N1ghtLight 提出的 hack。在编码中如此标记。

更新 2:编辑/更正问题描述 + 带有屏幕截图的新测试用例。

4

2 回答 2

1

在将N1ightLight中的示例项目与我自己的实现进行了数小时的比较之后,我终于发现了核心差异。实际上有两个问题在起作用:

  1. 出于某种原因,我在创建 MDI 子窗口时有以下行,这显然搞砸了大小处理。摆脱这条线消除了对先前提出的黑客的任何需要。结合 N1ghtLight 提出的布局,现在可以优雅地处理所有大小更改。

    setWindowState(Qt::WindowMaximized); // do not use that state!
    
  2. 关于选项卡关闭的第二部分(关闭一个选项卡并没有以预期的方式和大小显示下一个选项卡),实际上在 Qt 文档中进行了解释:

    当您创建自己的子窗口时,如果您希望窗口在 MDI 区域中关闭时被删除,则必须设置 Qt::WA_DeleteOnClose 小部件属性。否则,窗口将被隐藏,MDI 区域不会激活下一个子窗口。

    由于我正在创建自己的子窗口,因此我必须设置该标志,但我从未这样做过,因为我还想阻止 Qt 自动删除我的内容小部件。我现在的解决方案是设置标志,但是每当 MDI 子项即将关闭时,我都会删除小部件的链接,因此 Qt 无法删除它。

    void CustomMDIWindow::closeEvent(QCloseEvent* pEvent)
    {
        setWidget(0);
        pEvent->accept();
    }
    

我会将自己的答案标记为正确答案,但会将赏金奖励给N1ightLight,因为他的支持最终让我找到了最终解决方案。

于 2014-10-01T16:36:06.667 回答
0

丑陋的解决方法实际上可以调用setActiveSubWindow()两次:首先是一些可用的子窗口,然后是新创建的子窗口。这应该模拟您单击第一个选项卡然后返回到第二个选项卡时的情况。

于 2014-09-25T20:14:30.317 回答