2009-11-16 3 views
2

Je travaille sur une petite application qt (en utilisant PyQt4) et j'ai trouvé une idée, mais je ne suis pas sûr de la façon de l'implémenter. J'ai un QTableView qui représente certaines données et j'aimerais ajouter une autre colonne à QTableView qui contient un contrôle de case à cocher qui pourrait être câblé à une partie du modèle. Par exemple, quelque chose comme ceci:Incorporation d'un contrôle dans un QTableView?

alt text

Notez la colonne Supprimer a un widget case à cocher pour chaque ligne (bien que ce soit une application Web, pas une application Qt de bureau, le principe est le même). Points bonus si je peux sélectionner plusieurs lignes, faites un clic droit, et choisissez "Check/Uncheck Selected".

Si cela n'est pas clair, laissez un commentaire ici et je clarifierai.

Répondre

6

La mise en œuvre de votre propre modèle de table est plus de travail que d'utiliser QStandardItemModel (comme @Andy recommande), mais il ne vous donne une amende contrôle sur ce que vous voulez faire, alors je vais essayer de vous donner un résumé de ce qu'il faut faire. Je suppose que vous savez tout sur Qt's documentation et PyQt's class documentation et pouvez rechercher les classes dont vous avez besoin. (Je peux être overexplaining si vous avez déjà un QTableView mais mieux que de laisser quelque chose, je pense.)

Pour obtenir les états cochables:

  • Créer une sous-classe de QTableModel.
    • Sélectionnez une structure de données pour stocker le contenu de vos lignes. Cela peut être assez simple (une grande liste interne), ou aussi complexe qu'une base de données SQL (dans ce cas, voir QSqlTableModel à la place).
    • Remplacer rowCount, columnCount, data et setData.
      • rowCount et columnCount correspondent assez directement à ce que vous utilisez pour un modèle de données. Si vous utilisez essentiellement un tableau 2D (ou une liste de listes), ils peuvent être aussi courts que des lignes simples.
      • data est l'endroit où les choses deviennent intéressantes. Les modèles d'articles stockent plusieurs champs différents (Qt appelle rôles) et les retours data dépendent du rôle demandé. Notez que je parle des types de données de ce qui est retourné mais il doit toujours être enveloppé dans QVariant.
        • Qt.DisplayRole est le texte affiché dans les cellules de la table. Ce sont vos données réelles, et c'est de loin le cas le plus commun (de sorte que c'est le rôle par défaut).
        • Qt.CheckStateRole est un booléen.Renvoyer Qt.Checked affichera une case cochée, et Qt.Unchecked retournera une non cochée. Si tout ce que vous voulez qu'une colonne contienne, c'est que les cases à cocher ne gèrent que ce rôle.
        • Les autres rôles sont utiles pour les icônes, pour les couleurs d'arrière-plan et un certain nombre d'autres fonctionnalités, à l'exception de celles-ci.
        • Tout rôle non géré doit renvoyer un QVariant.
      • setData est symétrique à data. Vous devez gérer les rôles que vous gérez en data: Qt.DisplayRole pour les données réelles et Qt.CheckStateRole pour les cases à cocher.

Pour permettre la sélection multiple des lignes et des colonnes et des cellules. Pour ce faire, vous voulez comprendre selection models. La version courte est:

  • Définir le mode de sélection sur votre point de vue de la table: view.setSelectionMode(QAbstractItemView.ContiguousSelection). Cela vous permettra de mettre en évidence des cellules contiguës. Vous pouvez également mettre en évidence des cellules arbitraires: voir QAbstractView.SelectionMode.
  • Pour déterminer les cellules sont effectivement sélectionnées à la suite d'une action ask la vue de la table pour son modèle de sélection (notez le « l »): view.selectionModel().selectedIndexes(). Vous pouvez parcourir ces étapes avec une boucle for.

Pour autoriser un clic droit:

  • Override votre point de vue de contextMenuEvent.
  • Créez un QMenu et connectez-le à tous les emplacements dont vous avez besoin.

Pour une compréhension plus approfondie, lisez le Qt guide to Model/View si vous ne l'avez pas déjà fait. Et certainement regarder le Qt item view examples. Beaucoup de ceux décrits sont implémentés dans PyQt avec beaucoup moins de code (y compris les deux mentions @Jesse), et les exemples de modèles d'arbre se reportent aux tables mais avec beaucoup moins de travail (vous devez beaucoup moins implémenter, comme décrit ci-dessus.)

1

Dans Qt/C++, vous pouvez créer un délégué pour les éléments personnalisés dans une colonne. Je suppose que vous pouvez faire quelque chose de très similaire dans PyQt. Voir les exemples suivants:

Star Delegate Example
Spin Box Delegate Example

3

Vous pouvez également jeter un oeil à la QStandardItemModel, ce qui vous donne une interface pour interagir avec les éléments par un état « checkable »!

Vous pouvez également hériter de QAbstractItemModel et d'utiliser le rôle Qt :: CheckStateRole ...

Questions connexes