Col*_*sen 18
使用QWidget :: saveGeometry功能将当前设置写入注册表.(使用QSettings访问注册表).然后在启动时使用restoreGeometry()返回到先前的状态.
ifo*_*e2d 18
我发现在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();
}
Run Code Online (Sandbox Code Playgroud)
在main()中,在第一次显示窗口之前读取位置设置...
MainWindow mainWindow;
mainWindow.readPositionSettings();
mainWindow.show();
Run Code Online (Sandbox Code Playgroud)
...并且这些事件处理程序会根据需要更新设置.(这会导致在移动过程中为每个鼠标移动写入设置文件并调整大小,这是不理想的.)
void MainWindow::moveEvent( QMoveEvent* )
{
writePositionSettings();
}
void MainWindow::resizeEvent( QResizeEvent* )
{
writePositionSettings();
}
void MainWindow::closeEvent( QCloseEvent* )
{
writePositionSettings();
}
Run Code Online (Sandbox Code Playgroud)
不过,位置的垂直分量不是很正确,它似乎忽略了窗口标题栏的高度......如果有人知道如何处理那个让我知道:)