QtGui.QIdentityProxyModel отсутствует в PySide?

Я хочу написать свою собственную прокси-модель, чтобы «сгладить» древовидную модель (т. е. некоторые элементы могут иметь дочерние элементы) в модель, подобную списку (т. е. элементы не имеют дочерних элементов), сопоставляя индексы. Подкласс QtGui.QIdentityProxyModel кажется лучшим способом: http://qt-project.org/doc/qt-4.8/qidentityproxymodel.html, но я не могу найти его в PySide 1.2.1, созданном с помощью Qt 4.8 (включая QIdentityProxyModel): http://seanfisk.github.io/pyside-docs/pyside/PySide/QtGui/index.html.

Так что это, кажется, оставляет мне два варианта:

  1. подкласс QAbstractProxyModel или QSortFilterProxyModel

  2. найти способ самостоятельно собрать PySide, чтобы включить QIdentityProxyModel

Любые предложения будут оценены.


person Falcon    schedule 29.12.2013    source источник
comment
Пожалуйста, уточните, почему вы хотите использовать древовидное представление в качестве списка, когда вы можете просто использовать список.   -  person lpapp    schedule 29.12.2013
comment
у меня есть одна модель, которую я хочу представить в двух разных представлениях: как в виде дерева, так и в виде списка, где перечислены все узлы, то есть сплющенное/пройденное дерево, а не только узлы верхнего уровня.   -  person Falcon    schedule 29.12.2013


Ответы (1)


Я бы выбрал 2), потому что это было бы полезно и для потомков, если у вас будет достаточно времени, чтобы пройти через это.

Сначала вам нужно собрать и установить shiboken, так как это зависимость для сборки pyside. Вы можете сделать это следующим образом:

* git clone [email protected]:pyside/shiboken.git
* cd shiboken
* mkdir build
* cd build
* cmake -DCMAKE_INSTALL_PREFIX="/usr/local" ..
* n(make)
* n(make) install

Как только это будет сделано, вы начнете работать над pyside следующим образом:

* git clone [email protected]:pyside/pyside.git
* edit the PySide/QtGui/typesystem_gui_common.xml file:

Это мой вывод git diff:

diff --git a/PySide/QtGui/CMakeLists.txt b/PySide/QtGui/CMakeLists.txt
index 7625634..172f321 100644
--- a/PySide/QtGui/CMakeLists.txt
+++ b/PySide/QtGui/CMakeLists.txt
@@ -275,6 +275,7 @@ ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qshowevent_wrapper.cpp
 ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qsizepolicy_wrapper.cpp
 ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qslider_wrapper.cpp
 ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qsortfilterproxymodel_wrapper.cpp
+${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qidentityproxymodel_wrapper.cpp
 ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qsound_wrapper.cpp
 ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qspaceritem_wrapper.cpp
 ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qspinbox_wrapper.cpp
diff --git a/PySide/QtGui/typesystem_gui_common.xml b/PySide/QtGui/typesystem_gui_common.xml
index 711d7cc..4980fa4 100644
--- a/PySide/QtGui/typesystem_gui_common.xml
+++ b/PySide/QtGui/typesystem_gui_common.xml
@@ -4571,6 +4571,16 @@
     <modify-function signature="clear()" remove="all"/>
     <modify-function signature="filterChanged()" remove="all"/>
     <!--### End of obsolete section -->
+</object-type>
+  <object-type name="QIdentityProxyModel">
+    <extra-includes>
+      <include file-name="QItemSelection" location="global"/>
+    </extra-includes>
+    <modify-function signature="setSourceModel(QAbstractItemModel*)">
+      <modify-argument index="1">
+        <reference-count action="set"/>
+      </modify-argument>
+    </modify-function>
   </object-type>
   <object-type name="QSlider">
       <enum-type name="TickPosition" />

После этого вам нужно будет настроить, собрать и установить проект следующим образом:

* mkdir build
* cd build
* cmake -DCMAKE_INSTALL_PREFIX="/usr/local" -DCMAKE_PREFIX_PATH="/usr/local" ..
* (n)make
* (n)make install

Я предоставляю эти команды для Unix, но их легко адаптировать и для других операционных систем, таких как Windows.

Я не утверждаю, что мой патч идеален, но именно с него вы можете начать эксперимент. Это не должно быть слишком сложно.

Кроме того, не забывайте, что есть третий вариант, использующий PyQt, где этот класс вроде бы поддерживается:

Справочник по классу QIdentityProxyModel

person lpapp    schedule 29.12.2013
comment
Вариант 2 мне тоже больше нравится и спасибо за подробную инструкцию! Но я не уверен, что перераспределить модифицированный PySide (совместимый для разных платформ) легко. Сейчас я попробую PyQt (его лицензия...) и вариант 2 позже. - person Falcon; 29.12.2013
comment
@Falcon: я скоро внесу это изменение, так что не нужно беспокоиться о распространении. :) - person lpapp; 29.12.2013