qt的QMainWindow保存窗口和恢复窗口状态

保存窗口状态

cpp 复制代码
QSettings settings("MyCompany", "MyApp"); // 指定存储的应用信息
settings.setValue("mainWindowState", saveState());
  • saveState() 返回一个 QByteArray,包含 所有停靠窗口和工具栏的状态。
  • QSettings 用于存储数据,应用下次启动时可以恢复

恢复窗口状态

cpp 复制代码
QSettings settings("MyCompany", "MyApp");
restoreState(settings.value("mainWindowState").toByteArray());

restoreState() 需要传入 QByteArray,它会自动恢复所有停靠窗口和工具栏的状态。

完整示例

cpp 复制代码
#include <QApplication>
#include <QMainWindow>
#include <QDockWidget>
#include <QTextEdit>
#include <QSettings>
#include <QToolBar>
#include <QAction>

class MainWindow : public QMainWindow {
public:
    MainWindow() {
        setWindowTitle("QMainWindow Save/Restore Example");

        // 添加一个主编辑器
        QTextEdit *editor = new QTextEdit;
        setCentralWidget(editor);

        // 创建工具栏
        QToolBar *toolBar = addToolBar("Main Toolbar");
        QAction *action = new QAction("Test Action", this);
        toolBar->addAction(action);

        // 创建可停靠窗口
        QDockWidget *dock = new QDockWidget("Dock Window", this);
        QTextEdit *dockText = new QTextEdit;
        dock->setWidget(dockText);
        addDockWidget(Qt::LeftDockWidgetArea, dock);

        // 恢复状态
        restoreSettings();
    }

    void closeEvent(QCloseEvent *event) override {
        saveSettings();
        QMainWindow::closeEvent(event);
    }

private:
    void saveSettings() {
        QSettings settings("MyCompany", "MyApp");
        settings.setValue("mainWindowState", saveState());
        settings.setValue("mainWindowGeometry", saveGeometry());
    }

    void restoreSettings() {
        QSettings settings("MyCompany", "MyApp");
        restoreGeometry(settings.value("mainWindowGeometry").toByteArray());
        restoreState(settings.value("mainWindowState").toByteArray());
    }
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    MainWindow mainWindow;
    mainWindow.show();
    return app.exec();
}

(1) saveState() 和 restoreState()

  • saveState() 会存储:
    • 所有 QDockWidget 的位置、大小、停靠状态(浮动/嵌入)。
    • 所有 QToolBar 的状态(是否可见,位置)。
  • restoreState() 会根据存储的数据还原所有 UI 组件的位置和状态。

(2) saveGeometry() 和 restoreGeometry()

存储/恢复窗口大小和位置 ,通常配合 saveState() 使用

cpp 复制代码
settings.setValue("mainWindowGeometry", saveGeometry());
restoreGeometry(settings.value("mainWindowGeometry").toByteArray());

QSettings 的作用

  • QSettings 用于存储 应用数据 ,默认会在系统对应的 注册表 / 配置文件 里存储:
    • Windows: HKEY_CURRENT_USER\Software\MyCompany\MyApp
    • Linux/macOS: ~/.config/MyCompany/MyApp.conf
  • 这样即使应用关闭,下次启动时仍能恢复窗口状态。
相关推荐
沫璃染墨6 小时前
《Qt从零入门系列(十三):QSS样式表详解——从选择器与层叠规则到控件美化实战》
开发语言·css·c++·qt·ui·qt6.3·qss
好好学习O(∩_∩)O10 小时前
[QT] 多线程moveToThread 和易踩的8个坑
开发语言·qt
北i13 小时前
Dubbo 默认超时重试:把下游打雪崩的隐形放大器
开发语言·qt·dubbo
扶尔魔ocy15 小时前
【qt openGL入门笔记】OSG实现显示飞机模型飞行的点迹(二)
qt·opengl·osg
Python图像识别17 小时前
43-【2027毕设】YOLO11暴力检测识别系统 - Python完整源码+PyQt5界面+训练模型+数据集
python·qt·课程设计
bug和崩溃我都要1 天前
QT 开发的专业截图录屏工具 - macOS版 / Windows版
windows·qt·mac·录屏·截屏
Python图像识别1 天前
40-【2027毕设】YOLO11面部口罩检测识别系统 - Python完整源码+PyQt5界面+训练模型+数据集
python·qt·课程设计
Python图像识别1 天前
39-【2027毕设】YOLO11行人摔倒检测系统 - Python完整源码+PyQt5界面+训练模型+数据集
python·qt·课程设计
Quz2 天前
QML PathView:直线路径与曲线路径
qt·动画·qml
扶尔魔ocy2 天前
【qt openGL入门笔记】OSG实现飞机模型在网格图上飞行
qt·opengl·osg