Я создаю файл natvis для классов Qt, и я столкнулся с проблемой.
Чтобы визуализировать объекты QHash, я создал эти два типа:
<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>
Это в значительной степени работает, но поскольку QHash не является непрерывным в памяти, существует много недопустимых записей. Условие
reinterpret_cast<QHashNode<
$T1,$T2> *>(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 до сих пор.