这个功能是为了保留软件上一次的布局设置等信息,比如软件窗口上次的大小或坐标位置、停靠栏大小与位置、表格控件的行高列宽信息等等,从这些细节上优化易用性,在QT4与5中实现方法均不相同:
qt4:
// MainWindow.h
public slots:
void OnRestoreCatalogueView();
public:
void loadCfg();
void saveCfg();
void setCatalogueViewSize(CDockWidget *pWidget, QSize size);
// MainWindow.cpp
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 这里做自己的初始化操作
// ...
loadCfg();
}
// 加载配置信息
void MainWindow::loadCfg()
{
QSettints qcfg("xx.ini", QSettints::IniFormat);
QPoint pos = qcfg.value("/MainWindow/pos").toPoint();
QSize mainSize = qcfg.value("/MainWindow/size").toSize();
QSize dockSize = qcfg.value("/MainWindow/dockSize").toSize();
if(!pos.isNull() && pos.rx() != 0 && pos.ry() != 0)
move(pos);
if(!mainSize.isNull() && mainSize.width() > 0 && mainSize.height() > 0)
resize(mainSize);
setCatalogueViewSize(ui->dockWidget, dockSize);
}
// 保存配置信息
void MainWindow::saveCfg()
{
QSettints qcfg("xx.ini", QSettints::IniFormat);
qcfg.setValue("/MainWindow/pos", pos());
qcfg.setValue("/MainWindow/size", size());
qcfg.setValue("/MainWindow/dockSize", ui->dockWidget->size());
}
// 更新最大最小尺寸
void MainWindow::OnRestoreCatalogueView()
{
ui->dockWidget->setMinimumSize(QSize(1, 1));
ui->dockWidget->setMaximumSize(QSize(16777215, 16777215));
}
void MainWindow::setCatalogueViewSize(CDockWidget *pWidget, QSize size)
{
if(!pWidget)
return;
if(size.width() >= 0)
{
int nWidth = pWidget->width();
if(nWidth < size.width())
pWidget->setMinimumWidth(size.width());
else
pWidget->setMaximumWidth(size.width());
}
if(size.height() >= 0)
{
int nHeight = pWidget->height();
if(nHeight < size.height())
pWidget->setMinimumWidth(size.height());
else
pWidget->setMaximumWidth(size.height());
}
QTimer::singleShot(0, this, SLOT(OnRestoreCatalogueView()));
}
qt5.6以后有所变化,加载的时候QDockWidget不能再用setCatalogueViewSize初始化大小了,需要改为如下:
https://doc.qt.io/qt-5/qmainwindow.html#resizeDocks
void QMainWindow::resizeDocks(const QList<QDockWidget *> &docks, const QList<int> &sizes, Qt::Orientation orientation)
// 加载配置信息
void MainWindow::loadCfg()
{
QSettints qcfg("xx.ini", QSettints::IniFormat);
QPoint pos = qcfg.value("/MainWindow/pos").toPoint();
QSize mainSize = qcfg.value("/MainWindow/size").toSize();
QSize dockSize = qcfg.value("/MainWindow/dockSize").toSize();
if(!pos.isNull() && pos.rx() != 0 && pos.ry() != 0)
move(pos);
if(!mainSize.isNull() && mainSize.width() > 0 && mainSize.height() > 0)
resize(mainSize);
//setCatalogueViewSize(ui->dockWidget, dockSize);
QList<QDockWidget*> dockList;
QList<int> widthList;
dockList << ui->dockWidget;
widthList << dockSize.width();
this->resizeDocks(dockList, widthList, Qt::Horizontal);
}