- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
1. QT创建窗口程序、消息循环和WinMain函数
使用QT也有一段时间了,有的时候需要跟踪代码到QT的源码中去查找问题。在这里我将记录一下我跟踪QT源码学习到的一些知识。
我的开发环境是VC6.0+QT4.3.3。QT已经不为VC6.0提供addin了,所以有的时候我也会使用EclipseCDT来编写代码,因为有了QT for Eclipse的plugin写代码会方便一些。
?
我们在学习QT的时候,接触的第一个程序就是下面的helloworld程序:
view plain
#include?QApplication??
#include?QPushButton??
??
int?main(int?argc,?char?*argv[])??
{??
????QApplication?app(argc,?argv);?????
????QPushButton?hello(Hello?world!);??
????hello.resize(100,?30);????
????hello.show();??
????return?app.exec();??
}??
这个程序的作用很多手册和文档都已经讲了,讲的也都很细致,非常不错。
?
但是喜欢钻研,深入的童鞋也许开始注意了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的实现,原来窗口消息都是在这里进行处理的啊!
至于最后一句a
您可能关注的文档
最近下载
- 王兆安《电力电子技术》笔记.pdf VIP
- 2025京东自营在线客服考试题库及答案(完整版).docx VIP
- 2025年甘肃邮政社会招聘岗位详情笔试备考试题及答案解析.docx VIP
- 中国近现代史纲要2023版:第一章 进入近代后中华民族的磨难与抗争.pdf VIP
- 2025年甘肃邮政社会招聘岗位详情笔试备考题库及答案解析.docx VIP
- 2024年“学宪法、讲宪法”竞赛题库(含答案).docx VIP
- (新交际英语2024版)一年级上册全册教案(新教材).docx
- 2025年甘肃邮政社会招聘笔试备考试题及答案解析.docx VIP
- 北师大版数学三年级上册全册教案【完整版】.doc VIP
- 骨科常见并发症及对策培训课件.pptx VIP
文档评论(0)