Qt的窗口大部分使用不同的布局就可以解决问题.有些特殊的场合需要QSqlitter来分割窗口.通常QSqlitter动态划分的窗口是需要保存的.以免使用者每次打开软件都需要重新调整窗口分割.
本计划将QSqlitter提升为一个能够自动保存的类.可是调试中发现在窗口cpp中的代码可以保存.提升为类后,无法保存了.研究了一下才发现,Qt的ui提升类是在ui.setup中完成的.所以提升类中次修改的属性可能被ui覆盖.
所以使用了队列连接的信号来解决这个问题.
代码很简单
#ifndef STABLESPLITTER_H
#define STABLESPLITTER_H
#include <QSplitter>
class StableSplitter : public QSplitter
{
Q_OBJECT
public:
explicit StableSplitter(QWidget *parent = 0);
~StableSplitter();
private slots:
void reloadState();
private:
QString configItemName();
};
#endif // STABLESPLITTER_H
#include "stablesplitter.h"
#include <QSettings>
#include <QApplication>
StableSplitter::StableSplitter(QWidget *parent) :
QSplitter(parent)
{
connect(this,SIGNAL(objectNameChanged(QString)), this, SLOT(reloadState()), Qt::QueuedConnection);
//Qt::QueuedConnection 是必须指定的.设置为Qt::QueuedConnection属性,槽函数会在下一个事件循环中执行.setup就不会覆盖槽函数的设置了.
}
StableSplitter::~StableSplitter()
{
QSettings seter(qApp->applicationDirPath() + "/cfg.ini", QSettings::IniFormat);
seter.setValue(configItemName(), saveState());
}
void StableSplitter::reloadState()
{
QSettings seter(qApp->applicationDirPath() + "/cfg.ini", QSettings::IniFormat);
restoreState(seter.value(configItemName()).toByteArray());
}
QString StableSplitter::configItemName()
{
QString name;
QObject* object = this;
while(object != NULL)
{
name += object->objectName();
object = object->parent();
}
return name;
}