QT源码查看001-QApplication和QCoreApplication
QCoreApplication和QApplication的区别(1)
QApplication这个类是继承QCoreApplication的,而QCoreApplication有继承QObject的,而QObject就是QT中最基本的基类,也就是QT的根基了.
这里就从QCoreApplicatio说起吧,头文件中有这样的开始
class Q_CORE_EXPORT QCoreApplication : public QObjec
{
static QCoreApplication *instance() { return self; } }
1. Q_CORE_EXPORT是什么呢?如果在编写动态库时,定义DLL符号,Q_GUI_EXPORT就是导出函数或者类了,如果在应用程序中使用时,不定义Dll符号,Q_GUI_EXPORT就是导入类或者函数了,这里当然是导入了,我们写的可是命令行的,不是编写动态库,下面就是一些函数和变量的定义了
2. 因为是静态的static QCoreApplication *instance() { return self; }就是返回一个 self
static QCoreApplication *self;是一个私有的静态成员变量,实现在类外QCoreApplication *QCoreApplication::self = 0;
这里有必要看一下这个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是私有的,要在类外使用是不是应该定义一个共有成员函数什么的,先把疑问留在这里?
原来我们在类定义的上一行看到这样的代码
#define qApp QCoreApplication::instance()
定义了一个 qApp宏,这个宏也就成了一个指针,指向的是自己
样做又有什么用呢当我们在主程序中定义了 QCoreApplication app(argc, argv);对象的时候完全是不需要用qApp这个宏的啊,但是如果出了主函数要用这个对象怎么办,传吗?这样比较麻烦,QT用这个指向自己的东东就是帮助我们解决这样要在主函数外使用app这个对象的而找不到对象的苦恼。好了,在函数外你就用qApp吧,这样会不会有什么问题呢?这个东西在内存吗?嘿嘿,这是静态的啊,就在内存呆着呢,大胆的去用这个指向自己的宏指针吧,只要app没析构这东东就一直在内存。
下面来说明一下QApplication,这个是从 QCoreApplication继承来的,
#define qApp (static_cast<QApplication *>(QCoreApplication::instance()))
在类定义前有一段这样的代码,这里也是取 self这个指向自己的指针但是要做一个类型转换,至于这个类型转换是否安全,我想应该是安全的,因为相当于是从基类往派生类转换,基类有的应该是对拷贝的,但是这里的static会不会对这个造成困扰还不是很清楚,总之,要转换后这个qApp才能在主函数外使用。
这里还要说明的是这个 QCoreApplication是不是单例的问题,网上有很多人认为是单例,也有很多人赞成,但是我实践了一下应该不是单例
for(int i = 0 ; i < 3 ; ++i)
{
QCoreApplication app;
}
这里这样的操作时允许的,因为之前的已经析构了,QT中说的只允许创建一个是指在一个函数内,只能创建一个,这里显然不是,单例的实现一般都是通过私有构造函数来实现的,这里的构造函数是共有的显然不是单例的节奏。
QCoreApplication和QApplication的区别(2)
1. QCoreApplication用于non-GUI的应用程序(不需要依赖QtGui库),QApplication用于包含GUI的应用程序(需要用到QtGui库)。
2. QApplication继承了QGuiApplication类,而QGuiApplication继承了QCoreApplication类,而QCoreApplication又继承QObject的,而QObject就是QT中最基本的基类,也就是QT的根基。
endl;
最新文章
- 页面引入flash
- python时间处理函数
- C- struct的使用
- iOS 8自动调整UITableView和UICollectionView布局
- 自学hadoop(三)
- JSP自定义标签库
- python高级编程之访问超类中的方法:super()
- WPF基础
- Flink Program Guide (4) -- 时间戳和Watermark生成(DataStream API编程指导 -- For Java)
- android mediaplayer
- thinkphp5基础
- JAVA_SE基础——7.常量&变量
- Android View框架总结(三)View工作原理
- .net core 2.0 webapi部署iis操作
- org.hibernate.PropertyAccessException: Null value was assigned to a property of primitive type setter of com.*.Paper.totalTime
- View可以设置tag携带数据
- MySQL与Oracle的区别之我见
- Android Shell命令dumpsys
- Mysql语句优化
- Eclipse的汉化问题
热门文章
- PAT 甲级 1019 General Palindromic Number(20)(测试点分析)
- 文档根元素 ";mapper"; 必须匹配 DOCTYPE 根 ";configuration";
- 洛谷1993 小K的农场
- Qt5+VS2010的安装及使用
- 关于出现&ldquo;对不起,您安装的不是正版应用...&rdquo;的解决方法
- mcu 通信数据解析
- angular2在双向数据绑定时[(ngModel)]无法使用的问题
- Spring 常见注解
- Ubuntu服务器如何搭建PPTPD(原创保证可用)
- 更好的转换规则(深入理解c#)