QDockWidget::restoreGeometry QMainWindow 最大化时无法正常工作

QDockWidget::restoreGeometry not working correctly when QMainWindow is maximized

我有多个 QDockWidgets,全部停靠在一个 QMainWindow 中。

我已经覆盖了 showEvent,并且在将事件传递给基础后 class 我正在恢复停靠小部件的几何形状

void DockWidget::showEvent(QShowEvent* ev) 
{
    QDockWidget::showEvent(ev);

    QByteArray byte_array = settings_.value(id + ".geometry").toByteArray();

    LOG("rest: %s", QString(byte_array.toHex()));

    QDockWidget::restoreGeometry(byte_array);
}

在我的 QMainWindow::closeEvent 中,我正在为我的每个停靠小部件调用 saveSettings

void MainWindow::closeEvent(QCloseEvent* ev) 
{
    QList<DockWidget*> dock_widgets = findChildren<DockWidget*>();

    for (DockWidget* dock_widget : dock_widgets)
        dock_widget->saveSettings();

    QMainWindow::closeEvent(ev);
}

在我的停靠小部件的 saveSettings 函数中,我将 saveGeometry 的结果写入磁盘:

void DockWidget::saveSettings()
{
    QByteArray byte_array = QDockWidget::saveGeometry();

    LOG("save: %s", QString(byte_array.toHex()));

    settings_.setValue(id + ".geometry", byte_array);
    settings_.sync();
}

虽然这个 在我的 QMainWindow 未最大化时工作 ,但当它最大化时,小部件无法正确恢复。

this image 中,我在关闭之前安排了我的小部件。 (链接是因为内联图片会太大)

this image 中,我重新加载了我的应用程序,但小部件的几何图形加载不正确。

您可以在我上面的函数中看到我记录了正在保存和加载的几何字符串。

我已经向自己证明设置已正确保存并再次恢复,但不知何故无法正常工作

关闭应用;保存状态:

save: 01d9d0cb000200000000053f000000640000077f000001a00000053f000000640000077f000001a000000000000000000780

打开应用;恢复状态:(这里的十六进制数据与保存的完全一致)

rest: 01d9d0cb000200000000053f000000640000077f000001a00000053f000000640000077f000001a000000000000000000780

再次关闭应用程序,什么都不做:(十六进制数据现在不同,因为几何形状不同,请参见下面的标记)

save: 01d9d0cb000200000000053f000000640000077f0000014e0000053f000000640000077f0000014e00000000000000000780
                                                    ^                               ^

当 window 未最大化时不会发生这种情况。

这是 Qt 中的错误,还是我没有正确使用该功能?

我在 Ubuntu 16.04.

上使用 Qt 5.5

这是 Qt 中的错误。具体来说,QTBUG-46620 and possibly also QTBUG-16252.

QTBUG-46620 的错误报告详细说明了一种变通方法,您应该尝试一下。首先,确保在关闭应用程序时保存主要 window 几何图形和主要 window 状态(请注意,您不必单独保存每个停靠点 window 的几何图形) :

void MainWindow::closeEvent(QCloseEvent* ev)
{
     settings_.setValue("geometry", saveGeometry());
     settings_.setValue("state", saveState());
}

然后,还原几何体如下:

restoreGeometry(settings.value("geometry").toByteArray());
if (isMaximized())
{
    setGeometry( QApplication::desktop()->availableGeometry(this) );
}
restoreState(settings.value("windowState").toByteArray());

如果您在上述解决方法中遇到问题,您可能还必须保存 window:

的最大化状态
void MainWindow::closeEvent(QCloseEvent* ev)
{
     settings_.setValue("geometry", saveGeometry());
     settings_.setValue("state", saveState());
     settings_.setValue("maximized", isMaximized());
}

然后恢复如下:

restoreGeometry(settings.value("geometry").toByteArray());
if (settings.value("maximized").toBool())
{
    showMaximized();
    setGeometry( QApplication::desktop()->availableGeometry(this) );
}
restoreState(settings.value("windowState").toByteArray());

请注意,这些解决方法可能会导致在某些平台上生成一些警告消息。