博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[QT]QApplication和QCoreApplication的用法
阅读量:6758 次
发布时间:2019-06-26

本文共 2565 字,大约阅读时间需要 8 分钟。

 

转自:http://www.tuicool.com/articles/qmI7Bf

 

故事的背景是这样的,我们在写QT程序的时候或者在开始写QT程序之前总会看到这样的语句

QApplication app(argc, argv);

这是什么呢? QApplication这个类是继承QCoreApplication的,而QCoreApplication有继承

QObject的,而QObject就是QT中最基本的基类,也就是QT的根基了,这里就从QCoreApplication

说起吧,头文件中有这样的开始

class Q_CORE_EXPORT QCoreApplication : public QObject

Q_CORE_EXPORT是什么呢?如果在编写动态库时,定义DLL符号,Q_GUI_EXPORT就是导出函数或者类

了,如果在应用程序中使用时,不定义Dll符号,Q_GUI_EXPORT就是导入类或者函数了,这里当然是导

入了,我们写的可是命令行的,不是编写动态库,下面就是一些函数和变量的定义了,看到这里我震

惊了

QCoreApplication *  instance ()

定义一个指向自己的实例,啊?这是要闹哪样啊?难道要调用自己不成,实现就在类内,因为是静态的

static QCoreApplication *instance() { return self; }

就是返回一个 self

static QCoreApplication *self;

是一个私有的静态成员变量,实现在类外

QCoreApplication *QCoreApplication::self = 0;

这下算是知道这个 self是做什么的了,可是这里有个疑问,连 QCoreApplication自己都没被创建

呢,哪来的指向 QCoreApplication的指针存在呢?这里个人的解释是静态成员的创建应该类创建之

前就已经存在了,至于这个指向暂且就不考虑了,或许系统会解决这个问题吧,这里就当成是一个指

针吧。

这里有必要看一下这个QCoreApplication类的构造函数

QCoreApplication::QCoreApplication(int &argc, char **argv)    : QObject(*new QCoreApplicationPrivate(argc, argv)){    init();    QCoreApplicationPrivate::eventDispatcher->startingUp();#if defined(Q_OS_SYMBIAN) && !defined(QT_NO_LIBRARY)    // Refresh factoryloader, as text codecs are requested during lib path    // resolving process and won't be therefore properly loaded.    // Unknown if this is symbian specific issue.    QFactoryLoader::refreshAll();#endif#if defined(Q_OS_SYMBIAN) && !defined(QT_NO_SYSTEMLOCALE)    d_func()->symbianInit();#endif}

下面看着有点晕了,这里就只看 init();这个函数,就在构造函数的下面,这里的代码更多了,

这里只写我们关注的一行

void QCoreApplication::init(){     QCoreApplication::self = this;}

这里对 self进行了赋值,这就让这个self指向了当前这个对象,而不是什么也不指了,这个self就可

以代替当前对象来使用了,当然这只能在类内,因为self是私有的,要在类外使用是不是应该定义一

个共有成员函数什么的,先把疑问留在这里。

说完这个静态成员变量self还是没有解决这里为什么要闹这样的问题,原来我们在类定义的上一行看

到这样的代码 

#define qApp QCoreApplication::instance()

定义了一个 qApp宏,这个宏也就成了一个指针,指向的是自己,这样做又有什么用呢

当我们在主程序中定义了 QCoreApplication app(argc, argv);对象的时候完全是不需要用qApp这

个宏的啊,但是如果出了主函数要用这个对象怎么办,传吗?这样比较麻烦,QT用这个指向自己的东

东就是帮助我们解决这样要在主函数外使用app这个对象的而找不到对象的苦恼。好了,在函数外你就

用qApp吧,这样会不会有什么问题呢?这个东西在内存吗?嘿嘿,这是静态的啊,就在内存呆着呢,大

胆的去用这个指向自己的宏指针吧,只要app没析构这东东就一直在内存。

 

   下面来说明一下QApplication,这个是从 QCoreApplication继承来的,

#define qApp (static_cast
(QCoreApplication::instance()))

在类定义前有一段这样的代码,这里也是取 self这个指向自己的指针但是要做一个类型转换,至于这个类型转换是否安全,我想应该是安全的,因为相当于是从基类往派生类转换,基类有的应该是对拷贝的,但是这里的static会不会对这个造成困扰还不是很清楚,总之,要转换后这个qApp才能在主函数外使用。

   这里还要说明的是这个 QCoreApplication是不是单例的问题,网上有很多人认为是单例,也有很多人赞成,但是我实践了一下应该不是单例

for(int i = 0 ; i < 3 ; ++i){    QCoreApplication app;}

这里这样的操作时允许的,因为之前的已经析构了,QT中说的只允许创建一个是指在一个函数内,只能创建一个,这里显然不是,单例的实现一般都是通过私有构造函数来实现的,这里的构造函数是共有的显然不是单例的节奏。

转载地址:http://auweo.baihongyu.com/

你可能感兴趣的文章
Fiddler如何添加ServerIP显示
查看>>
Android瀑布流优化,解决Recyclerview展示大批量图片时Item自动切换、闪烁、空白等问题...
查看>>
《c程序设计语言》读书笔记-5.4-指针实现strend
查看>>
Android 系统默认音量和最大音量
查看>>
MPlayer-ww 增加边看边剪切功能
查看>>
vim利器:vundle 管理器和NERDTree插件
查看>>
系统虚拟机
查看>>
java集合之ArrayList(1)
查看>>
getMemory的经典例子
查看>>
android分析之mutex
查看>>
Tyvj P3119 核电站问题 动态规划
查看>>
【操作系统】总结三(内存管理)
查看>>
关于byte[]和字符串的转换
查看>>
Swashbuckle.AspNetCore(v2.5.0)使用小记
查看>>
VirtulBox添加自定义分辨率
查看>>
Android Training Caching Bitmaps 翻译
查看>>
SpringMVC (五)视图解析器
查看>>
微信开发
查看>>
P3165 [CQOI2014]排序机械臂
查看>>
拉格朗日反演
查看>>