Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QDockWidget::最大化QMainWindow时restoreGeometry无法正常工作_C++_Qt_Qmainwindow_Qdockwidget - Fatal编程技术网

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