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

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

+0

谢谢,第一个建议完美地工作!实际上,唯一需要改变的是使用'geometry'和'setGeometry'来代替'saveGeometry' /'restoreGeometry' –