简述
本节介绍如何使用geometry属性保存和恢复窗口的几何形状。在Windows中,基本上是存储QWindow::geometry()的结果,并在下次会话调用show()之前,调用QWindow::setGeometry()。
在X11中,这可能无法工作,因为一个不可见的窗口没有边框。后来窗口管理器将装饰窗口。当这种情况发生时,窗口朝向屏幕的底部/右下角移动取决于装饰框的大小。虽然X提供了一种方法来避免这种转变,有些窗口管理器仍无法实现此功能。
详细描述
当使用Qt Widgets时,Qt提供了保存和恢复一个窗口部件的几何形状和状态的函数。QWidget::saveGeometry()保存窗口的尺寸和最大化/全屏状态,而QWidget::restoreGeometry()用来恢复它。恢复函数还检查恢复几何形状是否超出可用的屏幕几何形状,如果超过了,则会适当地进行修改。
保存/恢复几何形状的方式有两种:
- 保存/恢复geometry()
- 保存/恢复pos()、size()
保存/恢复geometry()
保存几何形状
一般情况下,在程序退出之前,保存最后一次的几何形状和位置。
void MyMainWindow::closeEvent(QCloseEvent *event)
{
QSettings settings("MyCompany", "MyApp");
settings.setValue("geometry", saveGeometry());
settings.setValue("windowState", saveState());
QMainWindow::closeEvent(event);
}
恢复几何形状
在show()之前,然后读取上次保存的信息,一般在构造函数中调用。
void MainWindow::readSettings()
{
QSettings settings("MyCompany", "MyApp");
restoreGeometry(settings.value("myWidget/geometry").toByteArray());
restoreState(settings.value("myWidget/windowState").toByteArray());
}
另一种方式是同时存储pos()和size(),并在show()之前调用QWidget::resize()和move() 。
保存/恢复pos()、size()
保存几何形状
一般情况下,在程序退出之前,保存最后一次的几何形状和位置。常在closeEvent()中调用。
void MainWindow::writeSettings()
{
QSettings settings(QCoreApplication::organizationName(), QCoreApplication::applicationName());
settings.setValue("geometry", saveGeometry());
}
恢复几何形状
在show()之前,然后读取上次保存的信息,一般在构造函数中调用。
void MainWindow::readSettings()
{
QSettings settings(QCoreApplication::organizationName(), QCoreApplication::applicationName());
const QByteArray geometry = settings.value("geometry", QByteArray()).toByteArray();
if (geometry.isEmpty()) {
const QRect availableGeometry = QApplication::desktop()->availableGeometry(this);
resize(availableGeometry.width() / 3, availableGeometry.height() / 2);
move((availableGeometry.width() - width()) / 2,
(availableGeometry.height() - height()) / 2);
} else {
restoreGeometry(geometry);
}
}