版权声明
本文为原创作品,请尊重作者的劳动成果。转载必须保持文章完整性,并以超链接形式注明原始作者“ tingsking18 ”和 主站点 地址,方便其他朋友提问和指正。
QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数
QT源码解析(二)深入剖析QT元对象系统和信号槽机制
QT源码解析(三)深入剖析QT元对象系统和信号槽机制(续)
QT源码解析(四)剖析Qt的事件机制原理
QT源码解析(五)QLibrary跨平台调用动态库的实现
QT源码解析(六)Qt信号槽机制与事件机制的联系
QT源码解析(七)Qt创建窗体的过程
QT源码解析(八)Qt是如何处理windows消息的
QT源码解析(九)解析QDateTime
前言:分析Qt的代码也有一段时间了,以前在进行QT源码解析的时候总是使用ue,一个函数名在QTDIR/src目录下反复的查找,然后分析函数之间的调用关系,效率实在是太低了,最近总结出一个更简便的方法,就是利用Qt Creator这个IDE。
带来的好处是:
1. Qt Creator可以很方便的跟踪代码的调用,这样大大提高了分析代码的速度。
2. 函数间的调用关系能更加直观的找到。
3. 便于对代码的纵向关系的把握。
带来的坏处:
1. 只是展现了调用到的函数或者类的关系。
2. 缺少对类、某一组类、函数间关系的整体把握。
上面总结一下自己在QT源码解析时候用到的方法,下面开始步入正题。Qt创建窗体的过程,由于我对linux不是很熟悉,下面我所有的分析都是基于windows下的。
关于windows下利用API创建窗体。我这里就不多解释了,直接给出代码,然后结合下面的代码来分析一下Qt创建窗体的过程。
详细的解释请参考:
John Chen大牛的博文:WIN32 SDK界面编程
先写一个最简单的Qt程序:
来分析一下这个窗体程序是如何创建的。
首先关于main函数和winmain函数,为什么Qt的窗口程序是用main函数而非winmain,在我的另外一篇博文中有解释:QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数 这里不再解释
Windows窗体创建一定会调用RegisterClass这个函数的,我们在QTDIR/src里面搜索一下,有两个文件有这个函数一个是qapplication_win.cpp另外一个是qeventdispatcher_win.cpp,两个的作用不同,这次我们先研究qapplication_win.cpp中的RegisterClass函数,因为这个是与窗体创建有关的,下一篇QT源码解析(八)Qt是如何处理windows消息的 将会介绍qeventdispatcher_win.cpp中的RegisterClass的作用。
我们先将断点设置在qapplication_win.cpp中的 qt_reg_winclass 函数里,然后开始调试,运行到断点,然后我们看一下call stack如下图:
下面红色的框中为Call stack,我们可以看到函数调用的顺序,真正的创建QPushButton是在show()方法中,show()方法又调用了setVisible方法…… ……
QtWndProc就是窗体的回调函数,在RegisterClass的时候传给WNDCLASS结构的,QtWndProc同上面的API创建窗体的函数WndProc。
我们看一下QtWndProc的代码,也是一个switch (message) 然后一堆case来处理消息,最后也是调用DefWindowProc将不归他处理的消息交还给系统。
分享到:
相关推荐
Qt源码窥探(1)---创建窗口过程图解。。
在指定区域拖拉出一个新窗体,此窗体可改变大小,可移动,可叠加,可关闭.
QT遍历窗体的控件的方法 QT遍历窗体的控件 QT遍历窗体 QT遍历控件 QT遍历所有控件 QT遍历窗体的控件的方法 QT遍历窗体的控件 QT遍历窗体 QT遍历控件 QT遍历所有控件
qt源码 最好用的源码 qt源码 最好用的源码 qt源码 最好用的源码
一个基于Qt的串口通信协议解析和串口通信的程序,能实现串口的读写,和自定串口协议的解析,十分方便。
Qt 解析 dxf 文件源码
Qt实现解析二维码源码分享,Qt 二维码解析工具,Qt解析二维码实战。
基于QT实现的悬浮窗体,采用该QML实现的
Qt无边框窗口体拖拽边框改变窗体大小终极方法(橡皮筋窗体)
本demo 介绍了如何设计QT的无边框窗体 同时 解决了 窗体大小改变 以及移动的问题 同时也介绍了如果美化按钮等等
QT svg解析测试demo
Qt5.6.0源码,qt-everywhere-src-5.6.0-rc.zip
QT 用户登录界面 QT 窗体居中 QT 多窗体
QT5用代码生成一个窗体,并弹出显示窗体 参见: https://blog.csdn.net/xjzdr/article/details/115513093
用QT中最基础最简单知识,通过纯代码创建一个简单的窗口,并实现简单功能。代码简单清晰明了并且带有详细的注释,适合QT零基础的学友们。
Qt不规则窗体的实现,包括各种窗口实现的代码。
tcp通信Qt源码,客户端和服务器融合,可发文件和可发消息,
生成和解析简单的复杂的qtjson数据,比如在QJsonObject中添加QJsonArray数据,和解析这种复杂的数据,代码带有注释 。欢迎大家下载,
Qt基于数据库的学生管理系统源码 Qt基于数据库的学生管理系统源码 Qt基于数据库的学生管理系统源码 Qt基于数据库的学生管理系统源码 Qt基于数据库的学生管理系统源码 Qt基于数据库的学生管理系统源码...
log4qt 是 log4j 的 Qt 移植,原始项目地址(log4qt.sourceforge.net)于 2009 年起就没有更新,本次版本则是 github 上面的一个维护项目,使 log4qt 能够适用于最新版本的 Qt4 以及 Qt5。