Russian Qt Forum

Qt => Model-View (MV) => Тема начата: voltron от Март 26, 2011, 13:09



Название: Фильтрация иерархической модели
Отправлено: voltron от Март 26, 2011, 13:09
Есть DOM-модель xml-файла (сделана по примеру Simple DOM Model), для ее отображения используется QTreeView. Необходимо иметь возможность отображать как полное дерево, так и урезанное, состоящее из определенных узлов.

Как я понял, для этого нужно создать свою модель на основе QProxyFilterModel и переопределить метод filterAcceptsRow(). Вот в этом месте у меня и возникла проблема. Не совсем понятно как правильно реализовать filterAcceptsRow(), чтобы отображались только нужные узлы со своими дочерними элементами. Если я просто задаю список допустимых узлов и проверяю каждый узел на вхождение, то в результате получаю пустое дерево.


Название: Re: Фильтрация иерархической модели
Отправлено: voltron от Март 26, 2011, 16:49
Получилось отображать нужные узлы, но без дочерних элементов. Т.е., если у меня xml-файл такой структуры (фрагмент)
Код
XML
<?xml version="1.0" encoding="UTF-8"?>
<MD_Metadata xmlns:gco="http://www.isotc211.org/2005/gco"
            xmlns:gts="http://www.isotc211.org/2005/gts"
            xmlns:gss="http://www.isotc211.org/2005/gss"
            xmlns:gsr="http://www.isotc211.org/2005/gsr"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:xlink="http://www.w3.org/1999/xlink"
            xmlns:gml="http://www.opengis.net/gml"
            xmlns="http://www.isotc211.org/2005/gmd">
  <fileIdentifier>
     <gco:CharacterString>S5-_HRG_A--_CAM2_0132_-4_0406_-1_110126_081336_L1A-_ORBIT--Vers.0.01</gco:CharacterString>
  </fileIdentifier>
  <contact>
     <CI_ResponsibleParty>
        <individualName>
           <gco:CharacterString>Natasha Nickau</gco:CharacterString>
        </individualName>
        <organisationName>
....
 
То чтобы отобразить узел contact нужно чтобы в списке были: xml, MD_Metadata, contact. Тогда узел отображается, но его дочерние элементы — нет. Конечно, можно и их включать в список, но это как-то не очень красиво получается. Может, есть другой способ?