Je suis en train de créer un fichier natvis pour les classes Qt et j'ai rencontré un problème.
Afin de visualiser les objets QHash, j'ai créé ces deux types :
<Type Name="QHashNode<*,*>">
<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<QHashNode<$T1,$T2> *>(next)</Item>
</Expand>
</Type>
<Type Name="QHash<*,*>">
<DisplayString>{{ size={d->size} buckets={d->numBuckets} }}</DisplayString>
<Expand>
<IndexListItems>
<Size>d->numBuckets</Size>
<ValueNode Condition="reinterpret_cast<QHashNode<$T1,$T2> *>(d->buckets[$i]) != e">reinterpret_cast<QHashNode<$T1,$T2> *>(d->buckets[$i])</ValueNode>
</IndexListItems>
</Expand>
</Type>
Cela fonctionne à peu près, mais comme le QHash n'est pas continu en mémoire, il y a beaucoup d'entrées invalides. La condition
reinterpret_cast<QHashNode<
$T1,$T2> *>(d->buckets[$i]) != e
filtre déjà ceux qui ne sont pas valides, mais ils sont toujours affichés en tant que <Unable to display value>
.
Quelqu'un sait-il s'il existe un moyen d'ignorer complètement ces entrées ?
Je n'ai jamais vraiment travaillé avec le fichier autoexp.dat qui était l'ancienne façon de faire, mais en regardant le fichier avec le Qt-plugin installé, il me semble que l'instruction
#switch ($e.next != 0) #case 1 (
$e
)
fait exactement cela, donc j'espère qu'il y a peut-être un moyen de le faire dans le fichier natvis également ?
Si quelqu'un est intéressé, je peux vous donner le fichier natvis, mais je n'ai que QString, QByteArray, QList, QVector, QMap et (le problématique) QHash jusqu'à présent.