我在 Qt 应用程序中有一个 QMainWindow。当我关闭它时,我希望它存储其当前的还原大小(未最大化时的窗口大小)。当我以恢复模式(即未最大化)关闭窗口时,这很有效。但是,如果我在窗口最大化时关闭窗口,那么下次我启动应用程序并恢复应用程序(因为它以最大化模式启动)时,它就不会记住它应该恢复到的大小。有没有办法做到这一点?
4 回答
我发现在 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::saveGeometry功能将当前设置写入注册表。(使用 QSettings 访问注册表)。然后在启动时使用 restoreGeometry() 返回到之前的状态。
我也遇到过这个问题。
你可以做什么:除了窗口的大小,保存它是否最大化(QWidget::isMaximized()
)。
然后下次启动应用程序时,首先设置大小 ( QWidget::resize()
),然后在适当时将其最大化 ( QWidget::showMaximized()
)。恢复后,它应该恢复到正确的大小。
http://qt-project.org/doc/qt-4.8/application-windows.html上的图像显示,geometry.x()
andgeometry.y()
不等于x()
and y()
,它们与pos()
.
就我而言,我使用:
x()
y()
width()
height()
并通过以下方式成功恢复这些:
move()
resize()