Qt 之保存/恢复窗口的几何形状

简述

本节介绍如何使用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);
    }
}
展开阅读全文
©️2020 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值