[PYTHON] Créer un itérateur de modèle avec PySide

Lors de la création d'un modèle en forme d'arbre avec PySide, vous souhaiterez peut-être accéder à tous les éléments de manière séquentielle.

Si vous utilisez QTreeWidget, vous pouvez y accéder séquentiellement avec QTreeWidgetItemIterator. (Puisqu'il s'agit d'une bibliothèque pour C ++, c'est un peu gênant à utiliser avec python) Je l'ai créé parce que je veux utiliser l'itérateur pour QStandardItemModel et mon propre modèle.

Le code est python2, mais comme il n'utilise pas xrange, il fonctionne comme dans 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):
    """Itérateur de modèle
    :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

C'est facile à utiliser, il suffit de passer le modèle et il retournera l'itérateur.

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']

Non seulement le type d'arbre mais également le modèle de type table sont pris en charge.

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']

Itérateur inversé

J'ai également créé un itérateur inversé.

def model_iter_r(model, parent_index=QModelIndex(), col_iter=True):
    """Itérateur de modèle (ordre inverse)
    :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

L'utilisation est exactement la même que celle dans l'ordre.

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']

La structure arborescente est également suivie dans l'ordre inverse.

L'accès séquentiel aux modèles est une fonction fréquemment utilisée, mais il est difficile de mettre en œuvre chacun d'eux car il utilise récursif. Il est pratique de copier cette fonction.

La prochaine fois, nous utiliserons cette fonction pour créer un objet de recherche.

Recommended Posts

Créer un itérateur de modèle avec PySide
Faites une loterie avec Python
Faire un feu avec kdeplot
Faisons une interface graphique avec python.
Faites un son avec le notebook Jupyter
Faisons une rupture de bloc avec wxPython
Créer un système de recommandation avec python
Créer un filtre avec un modèle django
Faisons un graphe avec python! !!
Faisons un spacon avec xCAT
Faire un joli graphique avec plotly
Faisons un jeu de shiritori avec Python
Créer un lecteur vidéo avec PySimpleGUI + OpenCV
Créez un simulateur de gacha rare avec Flask
Faire une figure partiellement zoomée avec matplotlib
Créez un quiz de dessin avec kivy + PyTorch
Faisons la voix lentement avec Python
Créez un classificateur en cascade avec Google Colaboratory
Faisons un langage simple avec PLY 1
Faire un circuit logique avec Perceptron (Perceptron multicouche)
Faire Oui Non Popup avec Kivy
Faire une minuterie de lavage-séchage avec Raspberry Pi
Créer une animation GIF avec surveillance des dossiers
Créez un framework Web avec Python! (1)
Faisons une IA à trois yeux avec Pylearn 2
Créez une application de bureau avec Python avec Electron
Faisons un bot Twitter avec Python!
Implémenter un modèle avec état et comportement
Créez un framework Web avec Python! (2)
Essayez TensorFlow RNN avec un modèle de base
J'ai trouvé un moyen de créer un modèle 3D à partir d'une photo.
Un modèle qui identifie la guitare avec fast.ai
Un mémorandum pour faire WebDAV uniquement avec nginx
Créer un bot Twitter Trend avec heroku + Python
Fabriquer un appareil de surveillance avec un capteur infrarouge
Créez un simple générateur d'images par points avec Flask
Comment créer un dictionnaire avec une structure hiérarchique.
Je veux faire un jeu avec Python
Prédire l'été chaud avec un modèle de régression linéaire
Essayez de créer un code de "décryptage" en Python
Créer une barre de couleurs avec Python + Qt (PySide)
Remplaçons UWSC par Python (5) Faisons un robot
Créer un widget avec une couleur spécifiée avec Python + Qt (PySide)
Essayez de créer un groupe de dièdre avec Python
[Chat De Tornado] Créez un chat en utilisant WebSocket dans Tornado
Implémenter un modèle de régression logistique en temps discret avec stan
Transformez les données de vacances en une trame de données avec les pandas
(Mémorandum) Créer un diagramme de dispersion 3D avec matplodlib
Faisons un jeu de squash
Combinez des chaînes répétitives en une seule avec des expressions régulières Python.
Créer des couches Lambda avec Lambda
J'ai essayé de faire quelque chose comme un chatbot avec le modèle Seq2Seq de TensorFlow
Simulez une bonne date de Noël avec un modèle optimisé Python
Faire un bot d'analyse morphologique de manière lâche avec LINE + Flask
Faisons un outil de veille de commande avec python
Format A4 avec python-pptx
[Pratique] Créez une application Watson avec Python! # 2 [Fonction de traduction]
[Pratique] Créez une application Watson avec Python! # 1 [Discrimination linguistique]