通常,我喜欢QUrl,但是在代码中包含大量QUrl的情况下调试代码非常麻烦,而且我在调试中看不到实际的url字符串,因此必须在代码中放入toString的一些调试调用。是否有可能使其在调试监视中可见?

最佳答案

我知道这很老了,但是我自己偶然发现了这个问题,并决定以某种方式解决它。至少可以说,该解决方案是粗糙的,但它可以工作。

QUrl的问题在于将pimpl用于其所有内部结构,并且您在调试时无法访问QUrlPrivate的定义。更改QUrl中的任何内容后,此处的解决方案可能都会中断,因为它基于QUrlPrivate成员的偏移量。因此,如果将来的版本中有任何问题,您可以调整偏移量,这很好。这是从Qt 5.3.1开始的

<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">

    <Type Name="QUrl">
        <DisplayString Condition="reinterpret_cast&lt;QString*&gt;(reinterpret_cast&lt;char*&gt;(d) + 8)->d->size">{*reinterpret_cast&lt;QString*&gt;(reinterpret_cast&lt;char*&gt;(d) + 8)}://{*reinterpret_cast&lt;QString*&gt;(reinterpret_cast&lt;char*&gt;(d) + 20)}{*reinterpret_cast&lt;QString*&gt;(reinterpret_cast&lt;char*&gt;(d) + 24)}</DisplayString>
        <DisplayString>{*reinterpret_cast&lt;QString*&gt;(reinterpret_cast&lt;char*&gt;(d) + 24)}</DisplayString>
        <Expand>
            <Item Name="[scheme]">*reinterpret_cast&lt;QString*&gt;(reinterpret_cast&lt;char*&gt;(d) + 8)</Item>
            <Item Name="[host]">*reinterpret_cast&lt;QString*&gt;(reinterpret_cast&lt;char*&gt;(d) + 20)</Item>
            <Item Name="[path]">*reinterpret_cast&lt;QString*&gt;(reinterpret_cast&lt;char*&gt;(d) + 24)</Item>
            <Item Name="[query]">*reinterpret_cast&lt;QString*&gt;(reinterpret_cast&lt;char*&gt;(d) + 28)</Item>
        </Expand>
    </Type>


</AutoVisualizer>

只需将其保存到(例如):
%USERPROFILE%\My Documents\Visual Studio 2013\Visualizers\QUrl.natvis
希望对某人有用。

编辑:

假设您已经安装了其他Qt类型的natvis,尤其是QString

关于c++ - 在VS中将QUrl在调试中可视化为字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20401195/

10-11 21:05