1,简介
项目里常常需要把用户调整的各种窗口尺寸保存,下次打开同样的窗口时自动应用上次设定。
这里提供一个简单的配置类写法,根据窗口类名自动写对应配置,调用起来非常方便。
效果:
2,配置类代码
ConfigMgr.h:
#ifndef ConfigMgr_H
#define ConfigMgr_H
#include <QString>
#include <QWidget>
//单实例配置类
class ConfigMgr
{
public:
static ConfigMgr* Instance(){
static ConfigMgr m;
return &m;
}
void SaveWindowSize(QWidget* pWnd);
void LoadWindowSize(QWidget* pWnd);
private:
ConfigMgr();
public:
QString mIniPath;
};
#endif
ConfigMgr.cpp:
#include "ConfigMgr.h"
#include <QSettings>
#include <QCoreApplication>
ConfigMgr::ConfigMgr()
{
mIniPath = QCoreApplication::applicationDirPath() + "/config.ini";
}
void ConfigMgr::SaveWindowSize(QWidget* pWnd)
{
//获取窗口类名,建立对应配置
QString className = pWnd->metaObject()->className();
QSettings s(mIniPath, QSettings::IniFormat);
s.setValue(QString("/%1/width").arg(className), pWnd->width());
s.setValue(QString("/%1/height").arg(className), pWnd->height());
}
void ConfigMgr::LoadWindowSize(QWidget* pWnd)
{
QString className = pWnd->metaObject()->className();
QSettings s(mIniPath, QSettings::IniFormat);
int w = s.value(QString("/%1/width").arg(className), 0).toInt();
int h = s.value(QString("/%1/height").arg(className), 0).toInt();
if (w > 0 && h > 0)
{
pWnd->resize(w, h);
}
}
3,调用示例
在MainWindow中,closeEvent() 调用SaveWindowSize,保存尺寸到配置文件
构造函数调用 LoadWindowSize,加载配置
#include "ConfigMgr.h"
#include "DlgA.h"
#include "DlgB.h"
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ConfigMgr::Instance()->LoadWindowSize(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::closeEvent(QCloseEvent *event)
{
ConfigMgr::Instance()->SaveWindowSize(this);
QMainWindow::closeEvent(event);
}
void MainWindow::on_btnA_clicked()
{
DlgA dlg(this);
dlg.exec();
}
void MainWindow::on_btnB_clicked()
{
DlgB dlg(this);
dlg.exec();
}
在对话框里面也类似:
构造函数Load, 所有关闭窗口的地方Save
#include "DlgA.h"
#include "ui_DlgA.h"
#include "ConfigMgr.h"
DlgA::DlgA(QWidget *parent) :
QDialog(parent),
ui(new Ui::DlgA)
{
ui->setupUi(this);
ConfigMgr::Instance()->LoadWindowSize(this);
}
DlgA::~DlgA()
{
delete ui;
}
void DlgA::closeEvent(QCloseEvent *event)
{
ConfigMgr::Instance()->SaveWindowSize(this);
}
void DlgA::on_btnOK_clicked()
{
ConfigMgr::Instance()->SaveWindowSize(this);
accept();
}
void DlgA::on_btnCancel_clicked()
{
ConfigMgr::Instance()->SaveWindowSize(this);
reject();
}
3,Demo源码下载
链接:https://pan.baidu.com/s/1UPxv-BofOE13RulyJZanmg
提取码:9qh2