QT中QSettings 的用法 保存窗口的位置 大小

Qt4.0中又增加了一个非常有用的类QSettings,这个类是Qt4提供的一个读取配置文件的类,在Windows平台上,它提供了ini文件的读写,以及注册表的读写功能。我们都知道,用户对于应用程序经常有某种需要,比如说:窗体的大小,出现的位置,以及最近打开的文件等等,而这些需求均可由QSettings类实现。
一般来说settings都存放在系统之中,在windows操作系统下一般都是ini加密文件中或者是系统的注册表中,而对于mac系统来说,一般存放在XML文件中,下面我们就来看看它的具体用法。
读过《C++ GUI Programming with Qt 4, Second Edition》这本书的人应该都遇到过这个疑问,我们先来看看它的构造函数吧:

 
 
 
 
 
QSettings ( const QString & organization, const QString & application = QString(), QObject * parent = 0 )    
QSettings ( Scope scope, const QString & organization, const QString & application = QString(), QObject * parent = 0 )    
QSettings ( Format format, Scope scope, const QString & organization, const QString & application = QString(), QObject * parent = 0 )    
QSettings ( const QString & fileName, Format format, QObject * parent = 0 )    
QSettings ( QObject * parent = 0)

当我们创建一个QSettings的对象时,一般需要传递两个参数,第一个是公司或者组织的名称,第二个是应用程序的名称,我们以例子来说明问题:

QSettings settings("Yzs_think", "Application");

公司或组织名称:Yzs_think, 程序名称:Application

下面就要对其值进行设置(一般用法):

1、写入数据:

 
 
 
 
QPoint pos = settings.value( "pos" , QPoint(200, 200)).toPoint();    
QSize size = settings.value( "size" , QSize(400, 400)).toSize();    
resize(size);    
move(pos);

第一句是设置窗口出现的位置坐标,第二句实现了对窗口大小的设置,第三局和第四句如果 settings 里有以前存下的 ( 用 setValue 设置的 )pos 和 size 的值,则读取,如果没有,不会返回 null ,而会使用我们给它的起始值—— default value ——即应用程序第一次运行时的情况。

2、读出信息数据

 
 
 
QSettings settings( "Yzs_think" , "Application" );    
settings.setValue( "pos" , pos());    
settings.setValue( "size" , size());

这里值得注意的是写数据和读数据的时候的公司名称与应用程序名称必须一样,否则无法正常读取。

下面我们以一段具体的程序来说明问题:

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
void MainWindow::readSettings()    
{    
     QSettings settings( "Yzs_think" , "Application" );    
     QPoint pos = settings.value( "pos" , QPoint(200, 200)).toPoint();    
     QSize size = settings.value( "size" , QSize(400, 400)).toSize();    
     resize(size);    
     move(pos);    
}    
          
void MainWindow::writeSettings()    
{    
     QSettings settings( "Yzs_think" , "Application" );    
     settings.setValue( "pos" , pos());    
     settings.setValue( "size" , size());    
}
// readSettings() and writeSettings() 必须分别位于主窗体的构造函数和closeEvent函数里面。
 MainWindow::MainWindow()
 {
    ...
    readSettings();
 }
 void MainWindow::closeEvent(QCloseEvent*event)
 {
    if (userReallyWantsToQuit()) {
        writeSettings();
        event->accept();
    } else {
        event->ignore();
    }
 }

而后在我们的程序中,每次重新打开应用程序时,其窗口大小和位置都是上一次关闭之前的位置。

本文出自 “驿落黄昏” 博客,请务必保留此出处http://yiluohuanghun.blog.51cto.com/3407300/952807

三 、

在MainWindow构造函数中,我们调用readSettings()得到应用程序保存的设置选项。同样在closeEvent()中我们调用writeSettings()保存当前应用程序的设置。这是MainWindow需要实现的最后两个成员函数。
void MainWindow::writeSettings()
{
    QSettings settings("Software Inc.", "Spreadsheet");
    settings.setValue("geometry", geometry());
    settings.setValue("recentFiles", recentFiles);
    settings.setValue("showGrid", showGridAction->isChecked());
    settings.setValue("autoRecalc", autoRecalcAction->isChecked());
}
在writeSettring()中保存程序主窗口的几何信息(位置和大小),最近打开的文件列表,是否显示网格和是否自动计算属性。
在缺省情况下, QSettings在特定平台的位置存储应用程序的设置。在Windows中使用注册表;在Unix中把数据存贮在文本文件中;在Mac OS X平台上使用Core Foundation Preference API。
在构造函数中传递软件厂商和应用程序的名字,这些信息用来确定特定平台下应用程序设置文件的位置。
QSettings使用键值对存贮设置。键相当于一个文件系统目录,子键通过路径样式的语法确定(例如 findDialog/matchCase),或者使用 beginGroup()endGroup()对。
settings.beginGroup("findDialog");
settings.setValue("matchCase", caseCheckBox->isChecked());
settings.setValue("searchBackward", backwardCheckBox->isChecked());
settings.endGroup();
对应的值可是bool,double,QString,QStringList,或者是QVariant支持的其他数据类型,也包括注册过的用户自定义类型。
void MainWindow::readSettings()
{
    QSettings settings("Software Inc.", "Spreadsheet");
    QRect rect = settings.value("geometry",
                                QRect(200, 200, 400, 400)).toRect();
    move(rect.topLeft());
    resize(rect.size());
    recentFiles = settings.value("recentFiles").toStringList();
    updateRecentFileActions();
    bool showGrid = settings.value("showGrid", true).toBool();
    showGridAction->setChecked(showGrid);
 
    bool autoRecalc = settings.value("autoRecalc", true).toBool();
    autoRecalcAction->setChecked(autoRecalc);
}
 
readSettings()函数读取writeSettings()保存的程序设置。函数value()中的第二个参数是指在没有这项设置时取的默认值。一般默认值在第一次运行程序时使用。在读取最近程序列表时,没有第二个参数,则程序第一次运行时为空。
Qt 提供了QWidget::setGeometry()函数做为QWidget::geometry()的补充。但是在X11上由于窗口管理器多样的原因不能准确实现。所以我们使用move()和resize()。
MainWindow中要保存的设置,在readSettings()和writeSettings()只是一种可行方法之一。QSettings对象可以在程序运行过程中的任何时间任何位置读取和修改这些设置。
  

你可能感兴趣的:(QT中QSettings 的用法 保存窗口的位置 大小)