From: http://blog.csdn.net/qq575787460/article/details/7880972

学Qt时,发现只要包含头文件QApplication或者QCoreapplication,就用使用qApp,指向一个当前实例。

查看源码发现qApp是个宏:

QApplication中:#define qApp (static_cast<QApplication *>(QCoreApplication::instance()))

QCoreapplication中:#define qApp QCoreApplication::instance()

所以可以肯定的是QCoreApplication有个静态函数instance()返回指向自己的指针。

[cpp] view plaincopy
  1. static QCoreApplication *instance() { return self; }

这个函数返回self,看大片self也定义为静态指针:

[cpp] view plaincopy
  1. static QCoreApplication *self;

在QCoreapplication.cpp中有如下代码:

[cpp] view plaincopy
  1. void QCoreApplication::init()
  2. {
  3. ......
  4. QCoreApplication::self = this;
  5. ......
  6. }

QCoreapplication构造函数中又调用init()

[cpp] view plaincopy
  1. QCoreApplication::QCoreApplication(QCoreApplicationPrivate &p)
  2. : QObject(p, 0)
  3. {
  4. init();
  5. // note: it is the subclasses' job to call
  6. // QCoreApplicationPrivate::eventDispatcher->startingUp();
  7. }

所以就是:定义程序唯一的实例时,初始化self指向自身。qApp是一个宏,替换后为调用相应的instance()。

自己模仿的:

myApplication.h

[cpp] view plaincopy
  1. #ifndef MYAPPLICATION_H
  2. #define MYAPPLICATION_H
  3. #include <string>
  4. using std::string;
  5. #define myApp myApplication::instance()
  6. class myApplication
  7. {
  8. public:
  9. myApplication(string _appName);
  10. static myApplication* instance(){return self;}
  11. void printAppName();
  12. private:
  13. //指向自己的实例句柄
  14. static myApplication *self;
  15. string appName;
  16. };
  17. #endif // MYAPPLICATION_H

myApplication.cpp

[cpp] view plaincopy
  1. #include "myapplication.h"
  2. #include <iostream>
  3. using std::cout;
  4. using std::endl;
  5. myApplication::myApplication(string _appName):appName(_appName)
  6. {
  7. if(self!=0)
  8. return;
  9. else
  10. self=this;
  11. }
  12. void myApplication::printAppName()
  13. {
  14. cout<<appName<<endl;
  15. }
  16. myApplication* myApplication::self=0;

main.cpp

[cpp] view plaincopy
  1. #include "myapplication.h"
  2. extern void print1();
  3. extern void print2();
  4. int main()
  5. {
  6. print1();
  7. print2();
  8. myApplication app("实例测试");
  9. print1();
  10. print2();
  11. app.printAppName();
  12. myApp->printAppName();
  13. return 0;
  14. }

print1.cpp

[cpp] view plaincopy
  1. /*
  2. 测试函数,测试通过myApp输出唯一的实例名
  3. */
  4. #include "myapplication.h"
  5. #include <iostream>
  6. void print1()
  7. {
  8. if(myApp==0)
  9. std::cout<<"myApp没有实例化"<<std::endl;
  10. else
  11. myApp->printAppName();
  12. }

print2.cpp

[cpp] view plaincopy
  1. /*
  2. 测试函数,测试通过myApp输出唯一的实例名
  3. */
  4. #include "myapplication.h"
  5. #include <iostream>
  6. void print2()
  7. {
  8. if(myApp==0)
  9. std::cout<<"myApp没有实例化"<<std::endl;
  10. else
  11. myApp->printAppName();
  12. }

由Qt中qApp想到的(这是单例模式么???)相关推荐

  1. Qt中关于undefined reference to `vtable for故障总结

    在Qt中,undefined reference to 'vtable for 通常出现在打开了宏 Q_OBJECT的程式当中.我遇到的情况是: 将类体及类体实现直接写到main.cpp里,没有包含 ...

  2. 用事件队列解决GUI的操作顺序问题(Qt中处理方法)

    GUI操作顺序问题引发异常: 有时候我们使用写GUI程序的时候会遇到这样的问题:比如在程序中,建立了一个列表的GUI.这个列表是随着时间不断更新的,而且操作也会读取这个列表GUI的内容. 如果这个程序 ...

  3. Qt中事件循环机制详解

    问题1:Qt中常见的事件有哪些? 答:鼠标事件(QMouseEvent).键盘事件(QKeyEvent).绘制事件(QPaintEvent).窗口尺寸改变(QResizeEvent).滚动事件(QSc ...

  4. QT中父子窗口事件传递与事件过滤器

    处理监控系统的时候遇到问题,在MainWidget中创建多个子Widget的时候,原意是想鼠标点击先让MainWidget截获处理后再分派给子Widget去处理,但调试后发现如果子Widget重新实现 ...

  5. 关于QT中奇数个汉字出现newline in constant的错误

    前面写了一篇关于QT中使用汉字的博客以为对汉字的使用了如指掌, 没想到今天把字符串一换, 换成偶数个没问题, 换成奇数个汉字, 哇擦, 报一个错误newline in constant, 瞬间意识到自 ...

  6. 如何在Qt中使用zlib

    前言 环境:qt5.9.9 . zlib1.2.1. windows10.QtCreator4.11.0 本文介绍了在Qt中使用zlib的方式.使用的场景是在上位机软件中使用解压缩功能. 点击此处下载 ...

  7. 在Qt中使用OpenGL(四)

    前言 在Qt中使用OpenGL(一) 在Qt中使用OpenGL(二) 在Qt中使用OpenGL(三) 在之前的文章中,我们通过一个最简单的例子完成了在Qt中使用OpenGL绘图的全过程,然后又使用了纹 ...

  8. QT中关闭应用程序和窗口的函数(quit(),exit()以及close()的区别)

    QT中关闭应用程序和窗口的函数(quit(),exit()以及close()的区别) 使用QT编辑界面,其中带来很大方便的一点就是Qt中自带丰富的.种类齐全的类及其功能函数,程序员可以在编辑程序的过程 ...

  9. QT中使用fontawesome-webfont.ttf字体库

    QT中使用fontawesome-webfont.ttf字体库 fontawesome-webfont.ttf https://fontawesome.com/ http://www.fontawes ...

最新文章

  1. 【割边缩点】解题报告:POJ - 3694 - Network(Tarjan割边缩点 + LCA + 并查集优化)
  2. 基于时序数据的微内核预警引擎架构设计
  3. jquery 常用属性和函数(part I)
  4. 网络协议栈11:Connect函数分解之TCP层
  5. postman+newman生成html报告
  6. java学习(75):GUL文本框和标签
  7. ndarray对象的建立
  8. Spring MVC小DEMO
  9. python高阶函数(三分钟读懂)
  10. Android Spinner(下拉菜单)常用属性与点击事件获取值
  11. CBoard数据分析实战
  12. DBeaver下载安装教程
  13. 戴尔游匣G15怎么样?真实体验不翻车
  14. 5.Python格式化输出
  15. 从消息推送来看,华为、小米做得最好
  16. 李泉老师《高级商务礼仪锻造》
  17. Andriod Studio 线性布局(LinearLayout)
  18. C++函数指针与成员函数指针
  19. pymysql模块安装后,import pymysql找不到?
  20. 三星 N9006 note3 成功root

热门文章

  1. ORA-01555 原因与解决
  2. 派生类类型可以转换为基类类型,反之则不行
  3. 在Solaris系统下如何更改网络配置?
  4. python数据建模数据集_Python中的数据集
  5. 请不要更多的基本情节
  6. 5911. 模拟行走机器人 II
  7. leetcode1476. 子矩形查询
  8. linux中安装robot环境
  9. robot:当用例失败时执行关键字(发送短信)
  10. 浏览器中插入富文本编辑器