我正在为Qt类创建一个natvis文件,但遇到了问题。

为了可视化QHash对象,我创建了以下两种类型:

<Type Name="QHashNode&lt;*,*&gt;">
    <DisplayString Condition="next->next == 0">{{ key={key} value={value} h={h}}}</DisplayString>
    <DisplayString>{{ key={key} value={value} h={h} withCollision }}</DisplayString>
    <Expand>
        <Item Name="NextNode">reinterpret_cast&lt;QHashNode&lt;$T1,$T2&gt; *&gt;(next)</Item>
    </Expand>
</Type>

<Type Name="QHash&lt;*,*&gt;">
    <DisplayString>{{ size={d->size} buckets={d->numBuckets} }}</DisplayString>
    <Expand>
        <IndexListItems>
            <Size>d->numBuckets</Size>
            <ValueNode Condition="reinterpret_cast&lt;QHashNode&lt;$T1,$T2&gt; *&gt;(d->buckets[$i]) != e">reinterpret_cast&lt;QHashNode&lt;$T1,$T2&gt; *&gt;(d->buckets[$i])</ValueNode>
        </IndexListItems>
    </Expand>
</Type>

它几乎可以工作,但是由于QHash在内存中不连续,因此存在许多无效条目。
条件
reinterpret_cast&lt;QHashNode&lt;
$T1,$T2&gt; *&gt;(d->buckets[$i]) != e

已经过滤掉了无效的内容,但仍显示为<Unable to display value>

有谁知道是否有办法完全跳过这些条目?

我从未真正使用过autoexp.dat文件,这是旧方法,但是在查看安装了Qt插件的文件时,我觉得该语句
#switch ($e.next != 0) #case 1 (
    $e
)

确实如此,所以我希望natvis文件中也可能有一种方法?

如果有人感兴趣,我可以为您提供natvis文件,但是到目前为止,我只有QString,QByteArray,QList,QVector,QMap和(有问题的)QHash。

最佳答案

根据MSDN page on writing type visualizers<IndexListItems>根据定义是连续的:



另外,我可以将您指向the Qt Labs VSTools repositoryits documentation吗?特别是tools/Qt4EEAddin/qt5.natvis看起来很像我想尝试编写的东西? (或者实际上是您在写什么?^ _ ^)无论哪种方式,我认为您可以做的最好的就是qt5.natvis,它具有用于空<DisplayString>的特殊QHashNodes,但不会尝试在QHash中消除空存储桶。

10-07 14:48