Представление синтаксического дерева с помощью QTreeview

Я учусь над своей магистерской диссертацией, и я должен реализовать приложение для поиска глубоких синтаксических отношений (в будущем мы надеемся использовать их для создания семантических отношений) для турецких текстов.

Я подготовил интерфейс с PyQt для нашего приложения, и нам нужен модуль визуализации, представляющий синтаксическое дерево для каждого предложения в нашем корпусе в указанном формате.

Синтаксическое дерево примера ручного утопления с морфологическими признаками для каждого слова:

http://i.imgur.com/uWZPCvC.png

Поскольку я уже использую инструментарий графического интерфейса Qt, я думаю, что для этой цели можно быстро использовать Qtreeview. Но очевидно, что классический Qtreeview для файловой системы нуждается в некоторых настройках.

Минимальные ожидания для элементов дерева:

  1. метка для каждого подключения к узлу (если это невозможно, ее можно добавить в значки узлов)
  2. значок для каждого промежуточного узла и корневого узла
  3. (значок + поле морфологических признаков) для каждого узла выхода

Мой вопрос в том, как реализовать такое представление с помощью QTreeview. Особенно для выходных узлов, как мы можем создать блок морфологических признаков?

Если у вас есть идея, ребята, и привести небольшой пример, я был бы рад ^_^ Спасибо всем, кто прочитал и подумал над этим вопросом...


person cemagan    schedule 29.08.2014    source источник
comment
У Pyqtgraph есть какие-то пользовательские виджеты, которые могут быть полезны? Запустите приложение примеров и просмотрите все.   -  person three_pineapples    schedule 30.08.2014
comment
@three_pineapples, спасибо, чувак. Я только что прочитал страницу примеров на сайте pyqtgraph. Я видел, что есть некоторые виджеты, связанные с деревьями: DataTreeWidget, TreeWidget и elementtree. Я установлю pyqtgraph и запущу их примеры. Скоро сообщу о том, что нашел.   -  person cemagan    schedule 30.08.2014
comment
Существует также пример FlowChart, который может быть полезен (хотя похоже, что он предназначен для представления потока обработки данных с помощью функций, которые, я думаю, не совсем соответствуют тому, что вы хотите сделать)   -  person three_pineapples    schedule 30.08.2014
comment
См. также QTreeView с пользовательскими элементами.   -  person Trilarion    schedule 02.09.2014
comment
Спасибо Триларион за ваше предложение. Это практическое решение моего ответа. Вставив два значка в начале (один для синтаксической метки и один для типа узла) каждого элемента (который является узлом), мы можем получить простую древовидную диаграмму, близкую к тому, что мы хотим. Теперь я использую qpainter и алгоритм рекурсивного рисования дерева, который недавно написал. Если не получится, попробую предложенный вами способ.   -  person cemagan    schedule 04.09.2014


Ответы (2)


Я не думаю, что это возможно с QTreeView.

Посмотрите на QGraphicsScene и QGraphicsView. Эти классы должны быть очень хорошим решением для того, что вы собираетесь делать.

Пример сцены диаграммы будет полезен.

person Silicomancer    schedule 29.08.2014
comment
Спасибо за ваше предложение. Насколько я понимаю, мы должны указать позиции наших графических элементов (узлов дерева), которые будут соединены. Значит, надо их вычислить. В первую очередь я ищу виджет, реализованный для деревьев, который автоматически вычисляет все позиции в соответствии со структурой данных графа, которую сгенерирует наше приложение. И диаграмма не должна быть интерактивной. Достаточно статического. - person cemagan; 30.08.2014
comment
Я не думаю, что есть такой компонент. Может какой сторонний продукт я не знаю. Я предполагаю, что вам нужно будет использовать предложенные классы, даже если они более мощные, чем необходимо для вашей цели. - person Silicomancer; 30.08.2014
comment
На самом деле я использовал для этого matplotlib и graphviz (исполняемый файл, используемый через pygraphviz). Graphviz предназначался для расчетов компоновки узлов, а Matplotlib — для построения диаграммы. С помощью этого метода я смог создать древовидную диаграмму, которая визуально дополняет нас. Но проблема заключалась в его времени исполнения. Graphviz — это внешнее приложение, и matplotlib работает слишком медленно. Поэтому я решил реализовать модуль древовидной диаграммы, который использует инструментарий Qt GUI для скорости. Возможно, я рассчитаю макет по собственному алгоритму, а затем нарисую диаграмму с помощью Opainter или QGraphicsScene. Спасибо за твой совет, чувак. - person cemagan; 31.08.2014

Другой ответ - это то, что предлагает Триларион. Настройка элементов qtreewidget. ссылка на соответствующий вопрос и пример stackowerflow находится здесь

person cemagan    schedule 03.09.2014