我有一些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。
答案 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());
请注意,这些解决方法可能会导致在某些平台上生成一些警告消息。