【发布时间】:2010-09-09 15:15:27
【问题描述】:
我在 Qt 应用程序中有一个 QMainWindow。当我关闭它时,我希望它存储其当前的还原大小(未最大化时的窗口大小)。当我以恢复模式(即未最大化)关闭窗口时,这很有效。但是,如果我在窗口最大化时关闭窗口,那么下次我启动应用程序并恢复应用程序(因为它以最大化模式启动)时,它就不会记住它应该恢复到的大小。有没有办法做到这一点?
【问题讨论】:
我在 Qt 应用程序中有一个 QMainWindow。当我关闭它时,我希望它存储其当前的还原大小(未最大化时的窗口大小)。当我以恢复模式(即未最大化)关闭窗口时,这很有效。但是,如果我在窗口最大化时关闭窗口,那么下次我启动应用程序并恢复应用程序(因为它以最大化模式启动)时,它就不会记住它应该恢复到的大小。有没有办法做到这一点?
【问题讨论】:
使用QWidget::saveGeometry 功能将当前设置写入注册表。(使用QSettings 访问注册表)。然后在启动时使用 restoreGeometry() 恢复到之前的状态。
【讨论】:
QWidget::saveState()了。至少,它不在 Qt 4.8 或 5.7 中。 saveState() 似乎只出现在 QMainWindow 上。
http://qt-project.org/doc/qt-4.8/application-windows.html 处的图像显示,geometry.x() 和 geometry.y() 不等于 x() 和 y(),它们与 pos() 相同。
就我而言,我使用:
x()
y()
width()
height()
并成功恢复这些:
move()
resize()
【讨论】:
我发现在 Fedora 14 上需要结合前面的所有答案。小心不要在窗口最大化时保存大小和位置!
void MainWindow::writePositionSettings()
{
QSettings qsettings( "iforce2d", "killerapp" );
qsettings.beginGroup( "mainwindow" );
qsettings.setValue( "geometry", saveGeometry() );
qsettings.setValue( "savestate", saveState() );
qsettings.setValue( "maximized", isMaximized() );
if ( !isMaximized() ) {
qsettings.setValue( "pos", pos() );
qsettings.setValue( "size", size() );
}
qsettings.endGroup();
}
void MainWindow::readPositionSettings()
{
QSettings qsettings( "iforce2d", "killerapp" );
qsettings.beginGroup( "mainwindow" );
restoreGeometry(qsettings.value( "geometry", saveGeometry() ).toByteArray());
restoreState(qsettings.value( "savestate", saveState() ).toByteArray());
move(qsettings.value( "pos", pos() ).toPoint());
resize(qsettings.value( "size", size() ).toSize());
if ( qsettings.value( "maximized", isMaximized() ).toBool() )
showMaximized();
qsettings.endGroup();
}
在 main() 中,位置设置在第一次显示窗口之前被读取...
MainWindow mainWindow;
mainWindow.readPositionSettings();
mainWindow.show();
...这些事件处理程序会根据需要更新设置。 (这会导致在移动和调整大小期间每次鼠标移动都会写入设置文件,这是不理想的。)
void MainWindow::moveEvent( QMoveEvent* )
{
writePositionSettings();
}
void MainWindow::resizeEvent( QResizeEvent* )
{
writePositionSettings();
}
void MainWindow::closeEvent( QCloseEvent* )
{
writePositionSettings();
}
仍然,位置的垂直分量不太正确,它似乎忽略了窗口标题栏的高度......如果有人知道如何处理,请告诉我:)
【讨论】:
我也遇到过这个问题。
你可以做什么:除了窗口的大小,保存它是否最大化(QWidget::isMaximized())。
然后下次启动应用程序时,首先设置大小(QWidget::resize()),然后在适当时将其最大化(QWidget::showMaximized())。恢复后,它应该会恢复到正确的大小。
【讨论】: