QT 编程中保存全局数据的几种办法
QT做较大项目时总是有一些数据全局都会用到,比如option,setting之类的信息,在软件项目各处都需要随时访问,如何保存这些数据,使程序干净、清爽,又使用方便,是一门学问。
1. 全局变量 global variable
最简单的方法是全局变量,一般有点素养的程序员就不会采用这种办法,更不用说有“面向对象强迫症”的码农了,这种方法只限于很小的项目,不推荐。
2. 使用qApp
这是基于这么一个事实,在 QT的程序的任何地方,只要有下面的头文件包含:
#include
就可以使用 qApp 这个名字,指向一个当前 QApplication 实例。
查看源码可以看到,qApp实际是个宏:
在 QApplication 中:
#define qApp (static_cast<QApplication *>(QCoreApplication::instance()))
因此,可以从QApplication 继承(subclass)一个类,比如叫 MyApplication。
把要保持的全局变量放在这个新类中,就能随时访问到。
MyApplication.h
#include <QApplication>
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
原文地址:https://www.jb51.cc/wenti/3285716.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。