[PYTHON] Erstellen Sie mit PySide einen Modelliterator

Wenn Sie mit PySide ein baumförmiges Modell erstellen, möchten Sie möglicherweise nacheinander auf alle Elemente zugreifen.

Wenn Sie QTreeWidget verwenden, können Sie mit QTreeWidgetItemIterator nacheinander darauf zugreifen. (Da es sich um eine Bibliothek für C ++ handelt, ist die Verwendung mit Python etwas unpraktisch.) Ich habe es erstellt, weil ich den Iterator für QStandardItemModel und mein eigenes Modell verwenden möchte.

Der Code ist python2, aber da xrange nicht verwendet wird, funktioniert er wie in python3.

Code

#! usr/bin/python
# -*- coding: utf-8 -*-
from __future__ import unicode_literals, print_function, absolute_import
from PySide.QtCore import *
from PySide.QtGui import *


def model_iter(model, parent_index=QModelIndex(), col_iter=True):
    """Modelliterator
    :rtype: generator(QModelIndex)
    :type col_iter: bool
    :type parent_index: QModelIndex
    :type model: QAbstractItemModel
    """
    index = model.index(0, 0, parent_index)

    while True:
        if col_iter:
            for col in range(0, model.columnCount(parent_index)):
                yield index.sibling(index.row(), col)
        else:
            yield index

        if model.rowCount(index) > 0:
            for _ in model_iter(model, index, col_iter):
                yield _

        index = index.sibling(index.row() + 1, index.column())
        if not index.isValid():
            break

Es ist einfach zu bedienen, übergeben Sie einfach das Modell und es wird der Iterator zurückgegeben.

tree_model = QStandardItemModel()

item = QStandardItem("A")
item.appendRow(QStandardItem("A-1"))
item.appendRow(QStandardItem("A-2"))
tree_model.appendRow(item)

item = QStandardItem("B")
item.appendRow(QStandardItem("B-1"))
item.appendRow(QStandardItem("B-2"))
tree_model.appendRow(item)

item = QStandardItem("C")
tree_model.appendRow(item)

print([_.data() for _ in model_iter(tree_model)])
>>> [u'A', u'A-1', u'A-2', u'B', u'B-1', u'B-2', u'C']

Es wird nicht nur der Baumtyp, sondern auch das Tabellentypmodell unterstützt.

table_model = QStandardItemModel(3, 3)
for r in range(3):
    for c in range(3):
        table_model.setItem(r, c, QStandardItem("%d-%d" % (r, c)))

print([_.data() for _ in model_iter(table_model)])
>>> [u'0-0', u'0-1', u'0-2', u'1-0', u'1-1', u'1-2', u'2-0', u'2-1', u'2-2']

Iterator umkehren

Ich habe auch einen Reverse-Iterator erstellt.

def model_iter_r(model, parent_index=QModelIndex(), col_iter=True):
    """Modelliterator (umgekehrte Reihenfolge)
    :rtype: generator(QModelIndex)
    :type col_iter: bool
    :type parent_index: QModelIndex
    :type model: QAbstractItemModel
    """
    index = model.index(model.rowCount(parent_index) - 1, 0, parent_index)

    while True:
        if model.rowCount(index) > 0:
            for _ in model_iter_r(model, index, col_iter):
                yield _

        if col_iter:
            for col in range(model.columnCount(parent_index) - 1, -1, -1):
                yield index.sibling(index.row(), col)
        else:
            yield index

        index = index.sibling(index.row() - 1, index.column())
        if not index.isValid():
            break

Die Nutzung ist genau die gleiche wie in der Reihenfolge.

print([_.data() for _ in model_iter_r(tree_model)])
>>> [u'C', u'B-2', u'B-1', u'B', u'A-2', u'A-1', u'A']

print([_.data() for _ in model_iter_r(table_model)])
>>> [u'2-2', u'2-1', u'2-0', u'1-2', u'1-1', u'1-0', u'0-2', u'0-1', u'0-0']

Die Baumstruktur wird ebenfalls in umgekehrter Reihenfolge verfolgt.

Der sequentielle Zugriff auf Modelle ist eine häufig verwendete Funktion, die Implementierung ist jedoch schwierig, da rekursive Funktionen verwendet werden. Es ist bequem, diese Funktion zu kopieren.

Das nächste Mal werden wir diese Funktion verwenden, um ein Suchobjekt zu erstellen.

Recommended Posts

Erstellen Sie mit PySide einen Modelliterator
Machen Sie eine Lotterie mit Python
Machen Sie ein Feuer mit kdeplot
Lassen Sie uns eine GUI mit Python erstellen.
Machen Sie einen Sound mit Jupyter Notebook
Machen wir einen Blockbruch mit wxPython
Erstellen Sie ein Empfehlungssystem mit Python
Machen Sie einen Filter mit einer Django-Vorlage
Lassen Sie uns ein Diagramm mit Python erstellen! !!
Machen wir mit xCAT einen Spacon
Machen Sie eine schöne Grafik mit Plotly
Lassen Sie uns mit Python ein Shiritori-Spiel machen
Erstellen Sie einen Videoplayer mit PySimpleGUI + OpenCV
Machen Sie einen seltenen Gacha-Simulator mit Flask
Machen Sie mit matplotlib eine teilweise gezoomte Figur
Machen Sie ein Zeichnungsquiz mit kivy + PyTorch
Lassen Sie uns mit Python langsam sprechen
Erstellen Sie einen Kaskadenklassifizierer mit Google Colaboratory
Lassen Sie uns mit PLY 1 eine einfache Sprache erstellen
Machen Sie eine Logikschaltung mit Perceptron (Multilayer Perceptron)
Machen Sie Ja Nein Popup mit Kivy
Machen Sie einen Waschtrocknungs-Timer mit Raspberry Pi
Erstellen Sie eine GIF-Animation mit Ordnerüberwachung
Erstellen Sie ein Webframework mit Python! (1)
Machen wir mit Pylearn 2 eine dreiäugige KI
Erstellen Sie eine Desktop-App mit Python mit Electron
Machen wir einen Twitter-Bot mit Python!
Implementieren Sie ein Modell mit Status und Verhalten
Erstellen Sie ein Webframework mit Python! (2)
Probieren Sie TensorFlows RNN mit einem Basismodell aus
Ich habe mir eine Möglichkeit ausgedacht, aus einem Foto ein 3D-Modell zu erstellen.
Ein Modell, das die Gitarre mit fast.ai identifiziert
Ein Memorandum, um WebDAV nur mit Nginx zu erstellen
Machen Sie Twitter Trend Bot mit Heroku + Python
Stellen Sie ein Überwachungsgerät mit einem Infrarotsensor her
Erstellen Sie mit Flask einen einfachen Punktbildgenerator
So erstellen Sie ein Wörterbuch mit einer hierarchischen Struktur.
Ich möchte ein Spiel mit Python machen
Vorhersage des heißen Sommers mit linearem Regressionsmodell
Versuchen Sie, in Python einen "Entschlüsselungs" -Code zu erstellen
Erstellen Sie eine Farbleiste mit Python + Qt (PySide)
Ersetzen wir UWSC durch Python (5) Machen wir einen Roboter
Erstellen Sie mit Python + Qt (PySide) ein farbspezifisches Widget.
Versuchen Sie, mit Python eine Diedergruppe zu bilden
[Chat De Tornado] Erstellen Sie einen Chat mit WebSocket in Tornado
Implementieren Sie mit stan ein zeitdiskretes logistisches Regressionsmodell
Machen Sie Urlaubsdaten mit Pandas zu einem Datenrahmen
(Memorandum) Erstellen Sie mit matplodlib ein 3D-Streudiagramm
Lass uns ein Squashspiel machen
Kombinieren Sie sich wiederholende Zeichenfolgen mit regulären Python-Ausdrücken zu einer.
Bilden Sie Lambda-Schichten mit Lambda
Ich habe versucht, mit dem Seq2Seq-Modell von TensorFlow so etwas wie einen Chatbot zu erstellen
Simulieren Sie ein gutes Weihnachtsdatum mit einem Python-optimierten Modell
Machen Sie mit LINE + Flask einen morphologischen Analyse-Bot
Lassen Sie uns ein Befehls-Standby-Tool mit Python erstellen
A4 Größe mit Python-Pptx
[Übung] Erstellen Sie eine Watson-App mit Python! # 2 [Übersetzungsfunktion]
[Übung] Erstellen Sie eine Watson-App mit Python! # 1 [Sprachdiskriminierung]