转载 (转)3.6保存设置(Storing Settings)新一篇: (转)3.7多文档(Multiple Documents)在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()。在http://doc.trolltech.com/4.1/geometry.html中有详细解释。MainWindow中要保存的设置,在readSettings()和writeSettings()只是一种可行方法之一。QSettings对象可以在程序运行过程中的任何时间任何位置读取和修改这些设置。 到现在为止,我们已经完成了MainWindow的实现。在一下的几个小节中,我们将要讨论让Spreadsheet程序支持多文档,怎样显示启动画面。在下一章中,我们将会实现程序功能,如处理公式,排序等