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

时间:2017-05-16 15:38:17

标签: c++ qt qmainwindow qdockwidget

我有一些QDockWidgets,都停靠在一个QMainWindow中。

我已经覆盖了showEvent,并且在将事件传递给基类之后,我正在恢复停靠窗口小部件的几何

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);
}

在我的Dock小部件的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我重新加载我的应用和小部件&#39;几何图形加载不正确。

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

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

关闭应用;保存状态:

save: 01d9d0cb000200000000053f000000640000077f000001a00000053f000000640000077f000001a000000000000000000780

打开应用;恢复状态:(此处的十六进制数据与保存的一行完全匹配)

rest: 01d9d0cb000200000000053f000000640000077f000001a00000053f000000640000077f000001a000000000000000000780

再次关闭应用程序,没有触及任何内容:(现在十六进制数据不同,因为几何图形不同,请参阅下面的标记)

save: 01d9d0cb000200000000053f000000640000077f0000014e0000053f000000640000077f0000014e00000000000000000780
                                                    ^                               ^

当窗口没有最大化时,这不会发生。

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

我在Ubuntu 16.04上使用Qt 5.5。

1 个答案:

答案 0 :(得分:3)

这是Qt中的一个错误。具体而言,QTBUG-46620也可能QTBUG-16252

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

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());

如果您在上述解决方法中遇到问题,您可能还需要保存窗口的最大化状态:

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());

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