QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数
来源:互联网 发布:jsbridge 实现网络请求 编辑:程序博客网 时间:2024/05/28 11:30
版权声明
请尊重原创作品。转载请保持文章完整性,并以超链接形式注明原始作者“tingsking18”和主站点地址,方便其他朋友提问和指正。
QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数
QT源码解析(二)深入剖析QT元对象系统和信号槽机制
QT源码解析(三)深入剖析QT元对象系统和信号槽机制(续)
QT源码解析(四)剖析Qt的事件机制原理
QT源码解析(五)QLibrary跨平台调用动态库的实现
QT源码解析(六)Qt信号槽机制与事件机制的联系
QT源码解析(七)Qt创建窗体的过程
QT源码解析(八)Qt是如何处理windows消息的
QT源码解析(九)解析QDateTime
使用QT也有一段时间了,有的时候需要跟踪代码到QT的源码中去查找问题。在这里我将记录一下我跟踪QT源码学习到的一些知识。
我的开发环境是VC6.0+QT4.3.3。QT已经不为VC6.0提供addin了,所以有的时候我也会使用EclipseCDT来编写代码,因为有了QT for Eclipse的plugin写代码会方便一些。
我们在学习QT的时候,接触的第一个程序就是下面的helloworld程序:
这个程序的作用很多手册和文档都已经讲了,讲的也都很细致,非常不错。
但是喜欢钻研,深入的童鞋也许开始注意了int main(int argc, char *argv[]),这个main函数是标准的main函数,而windows应用程序的入口是winmain函数,而main函数是命令行程序的入口。win下窗口程序都有RegisterClass,和消息循环,QT是如何RegisterClass和创建消息循环的?
下面我们将来一起学习一下QT的源码来解释一下这个main函数和整个窗口程序的创建过程:
设置好路径后,我们先F10一下,看看这个程序到底是从哪里开始运行的。
程序跳到了/winmain/qtmain_win.cpp文件的WinMain函数中,再看这个文件上面的宏定义:#define main qMain
继续看:在WinMain函数中调用了我们自己定义的main函数:int result = main(argc, argv.data());
哇塞,原来如此啊。原来我们写的main函数是假的。哈哈。
再来看一下QT是如何创建窗体和消息循环的
首先我们来到QApplication的构造函数:
QApplication::QApplication(int &argc, char **argv, int _internal)
: QCoreApplication(*new QApplicationPrivate(argc, argv, GuiClient))
{ Q_D(QApplication); d->construct(); QApplicationPrivate::app_compile_version = _internal;}
很明显,首先调用的是QApplicationPrivate的构造函数。大家注意第三个参数:QApplication::Type type
这事Type类型的定义:enum Type { Tty, GuiClient, GuiServer };
下面是代码注释中对Type类型的解释:
/enum QApplication::Type
/value Tty a console application
/value GuiClient a GUI client application
/value GuiServer a GUI server application (for Qt for Embedded Linux)
当程序运行到hello.show()的时候调用了QWidgetPrivate::create_sys函数。
在这里我们看到调用了类似RegisterClass的函数:QString windowClassName = qt_reg_winclass(q);
这里的q是指向QWidget的指针(我们先忽略掉这里)。
以及包括后面的CreateWindow,ShowWindow等等我们熟悉的WindowsAPI函数
const QString qt_reg_winclass(QWidget *w) 函数的原型是在qapplication_win.cpp中定义的。我们转到qt_reg_winclass函数的实现中。我们就看到了windows的API函数RegisterClass和窗口消息处理函数:wc.lpfnWndProc = (WNDPROC)QtWndProc;
我们看一下QtWndProc的实现,原来窗口消息都是在这里进行处理的啊!
至于最后一句app.exec(); 调用了QCoreApplication的Exec函数,在这个函数中我们看到了下面创建消息循环的代码
QEventLoop eventLoop;
self->d_func()->in_exec = true;
int returnCode = eventLoop.exec();
在QCoreApplication.cpp中的注释是这样解释的:
The application will enter
the event loop when exec() is called. exit() will not return
until the event loop exits, e.g., when quit() is called.
到这里,main和WinMain函数到底是怎么回事,以及QT是怎么创建窗口和消息循环的,我们已经非常清楚了。
- QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数
- QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数
- QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数
- QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数
- 详解QT源码之QT创建窗口程序、消息循环和WinMain函数
- QT源码之QT创建窗口程序、消息循环和WinMain函数
- QT创建窗口程序、消息循环和WinMain函数
- WinMain()函数和消息循环
- WinMain函数 注册窗口类 消息循环
- 通过WinMain函数创建窗口
- QT源码解析之Qt处理Windows消息
- 控制台下创建窗口和WinMain入口创建窗口简单程序
- QT源码解析(七)Qt创建窗体的过程
- QT源码解析(七)Qt创建窗体的过程
- QT源码解析(七)Qt创建窗体的过程
- Qt信号-槽源码解析(一)
- QT IP窗口源码
- QT 创建无边窗口
- HDOJ 1058 Humble Numbers [简单DP]
- Excel去除中文,只留英文和数字
- My Eclipse 6.5 快捷使用及问题解决
- 改进的希尔排序
- HDOJ 1098 Ignatius's puzzle [数学归纳]
- QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数
- HTTP(转载)
- 谁养鱼的问题。据说是爱因斯坦出的题。
- 我的第一篇CSDN文章
- 不安装Oracle客户端远程连接Orcale数据库
- 【转】谁说Delphi没有哈希?--Delphi中,TStringList和THashedStringList的性能对比
- 甲流病例147例 重症1例
- new和malloc有什么区别?
- 预告:把你的Leopard变成OSX的系统发布服务器