当QMainWindow最大化时QDockWidget :: restoreGeometry不能正常工作
我有一个QDockWidgets
的数字,全部停靠在一个单独的QMainWindow
中。当QMainWindow最大化时QDockWidget :: restoreGeometry不能正常工作
我已经覆盖了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);
}
在我的码头小部件”小号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
^ ^
当窗口没有最大化时,不会发生这种情况。
这是Qt中的错误,还是我没有正确使用该功能?
我在Ubuntu 16.04上使用Qt 5.5。
这是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());
请注意,这些解决方法可能会在某些平台上生成一些警告消息。
谢谢,第一个建议完美地工作!实际上,唯一需要改变的是使用'geometry'和'setGeometry'来代替'saveGeometry' /'restoreGeometry' –