QT 编程中保存全局数据的几种方法

QT 编程中保存全局数据的几种办法

QT做较大项目时总是有一些数据全局都会用到,比如option,setting之类的信息,在软件项目各处都需要随时访问,如何保存这些数据,使程序干净、清爽,又使用方便,是一门学问。

1. 全局变量 global variable

最简单的方法是全局变量,一般有点素养的程序员就不会采用这种办法,更不用说有“面向对象强迫症”的码农了,这种方法只限于很小的项目,不推荐。

2. 使用qApp

这是基于这么一个事实,在 QT的程序的任何地方,只要有下面的头文件包含:
#include
就可以使用 qApp 这个名字,指向一个当前 QApplication 实例。
查看源码可以看到,qApp实际是个宏:
在 QApplication 中:
#define qApp (static_cast(QCoreApplication::instance()))

因此,可以从QApplication 继承(subclass)一个类,比如叫 MyApplication。
把要保持的全局变量放在这个心类中,就能随时访问到。

MyApplication.h

#include 
     class MyApplication : public QApplication
      {
            public:
            MyApplication( int argc, char* argv[] );
             ZdbOptions *zdbOptions ;
             ZdbSession *zdbSession ;
       };
     
  MyApplication.cpp
  
  MyApplication::MyApplication( int argc, char *argv[] ): QApplication(argc,argv)
   {
   }

main.cpp

#include "mainwindow.h"
#include "myapplication.h"

int main(int argc, char *argv[])
{
    MyApplication a(argc, argv);  // MyApplication subclassing the QApplication

    MainWindow w;
    w.show();

    return a.exec();
}

然后在程序任何其它地方,就可以
MyApplication myApp = (MyApplication)qApp ;
然后就可以访问:
myApp.zdbOptions
myApp.zdbSession
等全局数据。

3. 保存在 main window中

在基于主窗口的有界面的qt程序中,子对话框可以使用
MainWindow *p = (MainWindow *) parentWidget();
获得MainWindow ,因此可以把这个级别的全局数据保存在MainWindow 这个对象中,在主窗口和子窗口这个级别,都能方便访问到。
但是在其它对象中就不一定行了,这种方法只适合特定的程序架构。

4. 使用全局静态对象

类似下面这样,因为类定义基本可以认为是全局的,可以把所有全局数据都放到一个静态类中,它所有成员变量都是静态的。
这样所有 globalData.h的地方,都可以直接使用类似
globalData::loadSetting
这样的方法访问全局数据。

globalData.h

    class globalData
{
  //全局数据
public:
	globalData() ;
	 ~globalData() ;
    static ucreProject  *currentProject ;
	static bool hasCurrentProject ;
	static UCRE *mainWindow  ;
	static QString settingFileName  ;
	static QString loadSetting( QString key , QString value ) ;
	static QString saveSetting( QString key , QString value ) ;
	static bool showSelectProjectDialogOnStart() ;
};

#include "globalData.h"
#include "QSettings.h"

//静态成员必须在外部“重新”定义一下
bool          globalData::hasCurrentProject = false ;
ucreProject * globalData::currentProject = ( ucreProject *) 0 ;
UCRE        * globalData::mainWindow ;
QString       globalData::settingFileName = "ucre.ini" ;

globalData::globalData() 
{
}
 globalData::~globalData() 
{
}

 QString globalData::loadSetting( QString key , QString defaultValue ) 
 {
   QSettings *configIniRead = new QSettings( globalData::settingFileName , QSettings::IniFormat);  
   QString value = configIniRead->value( key , defaultValue ).toString();  
   
   delete configIniRead;  
   return value ;
 }

 QString globalData::saveSetting( QString key , QString value ) 
 {
   QSettings *configIniWrite = new QSettings( globalData::settingFileName , QSettings::IniFormat);  
   configIniWrite->setValue(  key , value );  
   
   delete configIniWrite;  
   return value ;
 }

  bool globalData::showSelectProjectDialogOnStart( ) 
 {
   QSettings *setting = new QSettings( globalData::settingFileName , QSettings::IniFormat);  
   QString value = setting->value( "main/showSelectProjectDialogOnStart" , "true" ).toString() ;  
   if( value == "true")
	   return true ;
   else if( value == "false" )
	   return false ;
   else
	   return true ;
 }

5. Qt dynamic property

通过 给你的 QApplication 对象设置一个 QVariant 类型的 property

你可能感兴趣的:(QT编程)