C++ QDockWidget::最大化QMainWindow时restoreGeometry无法正常工作
我有许多C++ QDockWidget::最大化QMainWindow时restoreGeometry无法正常工作,c++,qt,qmainwindow,qdockwidget,C++,Qt,Qmainwindow,Qdockwidget,我有许多QDockWidgets,它们都停靠在一个QMainWindow中 我已经覆盖了showEvent,在将事件传递到基类之后,我正在恢复dock小部件的几何体 void DockWidget::showEvent(QShowEvent* ev) { QDockWidget::showEvent(ev); QByteArray byte_array = settings_.value(id + ".geometry").toByteArray(); LOG("r
QDockWidgets
,它们都停靠在一个QMainWindow
中
我已经覆盖了showEvent
,在将事件传递到基类之后,我正在恢复dock小部件的几何体
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
中,我正在为我的每个dock小部件调用saveSettings
void MainWindow::closeEvent(QCloseEvent* ev)
{
QList<DockWidget*> dock_widgets = findChildren<DockWidget*>();
for (DockWidget* dock_widget : dock_widgets)
dock_widget->saveSettings();
QMainWindow::closeEvent(ev);
}
当my
QMainWindow
未最大化时,此确实起作用,但当它最大化时,小部件无法正确还原
在结束之前,我已经安排好了我的小部件。(链接,因为图像太大)
在中,我重新加载了我的应用程序,但小部件的几何体加载不正确
您可以在上面的函数中看到,我记录了保存和加载的几何体字符串
我已经向自己证明,设置已正确保存并再次恢复,但不知何故,它无法正常工作
关闭应用程序;保存状态:
save: 01d9d0cb000200000000053f000000640000077f000001a00000053f000000640000077f000001a000000000000000000780
打开应用程序;还原状态:(此处的十六进制数据与保存的数据完全匹配)
再次关闭应用程序,不要碰任何东西:(十六进制数据现在不同了,因为几何图形不同,请参见下面的标记)
当窗口未最大化时,不会发生这种情况
这是Qt中的一个错误,还是我没有正确使用功能
我正在Ubuntu 16.04上使用Qt5.5。这是Qt中的一个错误。具体地说,也有可能 QTBUG-46620的错误报告详细介绍了一种解决方法,您应该尝试一下。首先,确保在关闭应用程序时保存主窗口几何图形和主窗口状态(请注意,不必单独保存每个停靠窗口的几何图形): 然后,恢复几何体,如下所示:
restoreGeometry(settings.value("geometry").toByteArray());
if (isMaximized())
{
setGeometry( QApplication::desktop()->availableGeometry(this) );
}
restoreState(settings.value("windowState").toByteArray());
restoreGeometry(settings.value("geometry").toByteArray());
if (settings.value("maximized").toBool())
{
showMaximized();
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 (isMaximized())
{
setGeometry( QApplication::desktop()->availableGeometry(this) );
}
restoreState(settings.value("windowState").toByteArray());
restoreGeometry(settings.value("geometry").toByteArray());
if (settings.value("maximized").toBool())
{
showMaximized();
setGeometry( QApplication::desktop()->availableGeometry(this) );
}
restoreState(settings.value("windowState").toByteArray());
请注意,这些解决方法可能会导致在某些平台上生成一些警告消息。谢谢,第一个建议非常有效!事实上,唯一需要更改的是使用
geometry
和setGeometry
而不是saveGeometry
/restoregometry
我在ubuntu 20.04和python 3.6下也有同样的问题。这个答案中的解决方法对我不起作用,但是如果我添加了一个具有我喜欢的大小的虚拟dock小部件,并通过一个单发QTimer操作删除它,dock小部件的大小不会再次改变。此外,还有一种方法resizeDocks,但据我所知,该方法用于设置同一区域中的码头的相对大小,而不是不同区域中的码头大小
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());