Python の QAbstractItemModel でリストをラップして、PyQt に付属する GUI の利点を使用してリストをツリーとして表示できるようにしようとしています。正確には、PyQt5 と Python 3.3 を使用しています。
リスト項目へのポインターを明示的に生成しようとしましたが、親項目の識別に問題がありました。私はそれらを割り当てていません.createIndexを実行したときにPyQtがそれらをどのように割り当てるか、または割り当てるかどうかはわかりません. 次に、ネストされたリスト ["A",["a",[1,2,3]],"B", "C",["b",[4,5,6],"d"]] 次に、[4,1,1] を使用して 5 を指すことができます。次に、同じリストから最後の項目を除いたものを使用して親を取得します。 、[4,1]。
私の問題はこれです。行の値から生成されたリストを使用すると、CREATEINDEX メソッドによってコードがクラッシュします。私の、Minimum Broken Example (MBE) は以下のとおりです。"return self.createIndex(row,col,ptr)" を含む 2 行のコメントを外して、説明した内訳を確認します。
from PyQt5.QtGui import QFont, QColor
from PyQt5.QtCore import QAbstractItemModel, QModelIndex, Qt, QAbstractListModel, QAbstractTableModel, QSize, QVariant
from PyQt5.QtWidgets import QApplication, QTreeView, QTableView, QListView
class NodeTree(QAbstractItemModel) :
def __init__(self,parent,data) :
super(NodeTree,self).__init__(parent)
self.data = data
def rowCount(self, parent = QModelIndex()) :
# int rowCount (self, QModelIndex parent = QModelIndex())
if parent.isValid() :
data = self.data
for idx in parent.internalPointer() :
data = data[idx]
return len(data)
else :
return len(self.data)
def columnCount(self, parent = QModelIndex()) :
# int columnCount (self, QModelIndex parent = QModelIndex())
return 1
def data(self, index = QModelIndex(), role = None) :
# QVariant data (self, QModelIndex index, int role = Qt.DisplayRole)
if role == 0 :
if index.isValid() :
return str(index.internalPointer())
else :
return "No Data"
return None
def index(self,row,col, parent = QModelIndex()):
# QModelIndex index (self, int row, int column, QModelIndex parent = QModelIndex())
# QModelIndex createIndex (self, int arow, int acolumn, int aid)
# QModelIndex createIndex (self, int arow, int acolumn, object adata = 0)
if parent.isValid() :
ptr = [parent.internalPointer(),row]
# return self.createIndex(row,col,ptr)
return QModelIndex()
else :
ptr = [row]
# return self.createIndex(row,col,ptr)
return QModelIndex()
return QModelIndex()
def parent(self, child = QModelIndex()):
# QObject parent (self)
if child.isValid() :
print(child.internalPointer())
return QModelIndex()
if __name__ == "__main__" :
# http://blog.mathieu-leplatre.info/filesystem-watch-with-pyqt4.html
import sys
app = QApplication(sys.argv)
TreeView = QTreeView()
TreeModel = NodeTree(TreeView, [['A',['a',1]],['C','D'],['E','F']])
TreeView.setModel(TreeModel)
TreeView.show()
app.exec_()
私が理解していないのは、QModelIndex が CREATEINDEX 内で作成される方法と、INDEX メソッド内でオンザフライで生成されたリストでクラッシュする理由です。私にとって、INTERNALPOINTERは呼び出し間で保持されるべきであり、リストを渡すことは問題ないはずです。
私を混乱させるもう 1 つのことは、いつ、なぜ親とインデックスが呼び出されるかということです。私が理解しているように、インデックスはツリーを下にトラバースし、親は上にトラバースします。したがって、INDEX の呼び出しは (row,col) で親の子を識別し、PARENT は子を識別し、親を決定します。内部ポインタへの参照は完了していますか? もしそうなら、なぜ QmodelIndex は独自の PARENT メソッドを維持するのでしょうか。Qtは、インデックスと親の間の呼び出しに基づいてアイテム間の階層を確立する独自の内部ツリーを維持しているようです。つまり、My モデル用と表示用の 2 つのツリーが常に存在します。