Мне нужно написать класс QAbstractItemModel, который представляет иерархию различных типов объектов.В какой-то момент я хочу иметь возможность показать таблицу / список, содержащий только элементы уровня 1, только уровень 2 и т. Д.
Я работаю над анализатором сетевых протоколов, чем-то вроде wireshark.Я фиксирую socket.recv
и socket.send
события из процесса.В моей модели эти события называются NetworkEvent
.Каждое сетевое событие может содержать один или несколько Packet
.Каждый пакет имеет один или несколько Message
, где сообщение на основе его кода анализируется как определенная структура.
Вот изображение иерархии классов программы:

В главном окне есть список и дерево.Я ожидаю, что смогу показать:
- таблица / список, содержащий только сетевые события, включая его атрибуты.
- таблица / список, содержащий только пакеты, включая его атрибуты.
- таблица / список, содержащий только пакеты на основе сетевого события.
- дерево, содержащее иерархию пакетов / сообщений (с полями и подструктурами)
- таблица / список, содержащий только сообщения
- таблица / список, содержащий только сообщения на основе пакета
- дерево, содержащее иерархию сообщений (с полями и подструктурами).
Поэтому я подумал, что лучшеИдея состояла в том, чтобы смоделировать QAbstractItemModel
как дерево.Первая проблема, с которой я столкнулся, заключается в том, что, хотя у каждого класса есть понятие «дети», у каждого есть свое поле, представляющее детей, поэтому я должен позаботиться об этом внутри QAbstractItemModel
.
Кроме того, посколькутаблица / список EventNetwork
не имеет столбцов, совпадающих с таблицей / списком Packet
или Message
, я не могу правильно использовать ту же модель, чтобы определить все возможные способы отображения данных.Я полагаю, что правильным способом сделать это было бы определение моделей прокси для каждого вида представления.
Есть ли лучший или простой способ приблизиться к этому?Или это путь?