标签:文件 natvis Qt caption Visual VS Studio ptr
目录运行环境
IDE:Microsoft Visual Studio Community 2019, 16.11.15
Qt:5.12.5_msvc2017, 32bit
OS:Windows 10 家庭版,21H2
背景说明
我们在使用 VS 开发 Qt 程序时,经常会遇到无法观察 Qt 类型变量值的问题。网上有类似的解决 QString 等对象的方法,如VS调试状态下查看QString等QT变量_阿莫西林夹馍的博客-CSDN博客,不过像 QMainWindow、QWidget 等对象监控起来还是有些不方便,网上也没有搜到解决方法。调试Qt自带例子 addressbook ,在main.cpp 里查看 mw 变量,看到的主要就是一系列地址,用处不大。如果调试时想看下窗口的 caption 怎么办?
Qt 类的封装
-
QObject、QWidget、QMainWindow 的继承关系如下图所示。它们内部都有一个对应的“Private类”,指向内部的参数,即:QObjectPrivate、QWidgetPrivate、QMainWindowPrivate,而且Private类都是在cpp文件中定义的,因此它们的定义其实被“隐藏”了,外部是不可见的。
-
深入QObject可以知道Private类对象对应的是d_ptr,一个智能指针对象。
-
那 QMainWindow 是怎么访问 d_ptr 的?用 Q_D 宏。
-
Q_D 宏的定义,先调用d_func(),再调用qGetPtrHelper()获取d_ptr指向的对象,并已经完成类型转换,QMainWindow直接获得QMainWindowPrivate对象。
-
看到一个 有意思的地方,用 operator->() 访问智能指针内部保存的裸指针。下面我们就试试这个运算符。
用VS监视对象
-
VS变量监视器直接访问d_ptr,得到的是QScopedPointer对象,不是我们要的;
-
加上运算符,VS识别到了实际的类型,太棒了!
找到 caption 了,记住这串代码,后面有用。注意:类型里还有动态库名称的限制。
(*((Qt5Widgetsd.dll!QWidgetPrivate*)&(*((Qt5Widgetsd.dll!QMainWindowPrivate*)this->d_ptr.operator->())))).extra->topextra->caption
使用 natvis 文件
Natvis文件已经替换autoexp.dat文件来自定义监视变量,可以在项目中添加natvis文件,也可以更改用户级别的natvis文件。
-
在项目中使用natvis文件
-
添加natvis文件
-
编辑natvis文件
<?xml version="1.0" encoding="utf-8"?> <AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010"> <Type Name="QMainWindow"> <DisplayString>{{ caption = {(*((Qt5Widgetsd.dll!QWidgetPrivate*)&(*((Qt5Widgetsd.dll!QMainWindowPrivate*)this->d_ptr.operator->())))).extra->topextra->caption} }}</DisplayString> </Type> </AutoVisualizer>
因为natvis文件是xml格式的,所以“>”、“<”、“&”等要用实体引用。
-
-
使用用户级别natvis
-
直接编辑C:\Users\[user name]\Documents\Visual Studio 2019\Visualizers下的natvis文件
-
效果
可以显示 caption 信息了! 其他更多功能,就自由发挥啦。
参考文献
标签:文件,natvis,Qt,caption,Visual,VS,Studio,ptr 来源: https://www.cnblogs.com/octoberkey/p/16535577.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。