Question

Je travaille une petite application pintes (en utilisant PyQt4) et je suis venu avec une idée mais je ne suis pas certain de la façon de le mettre en œuvre. J'ai un QTableView qui représente des données et je voudrais ajouter une autre colonne à QTableView qui contient un contrôle de case à cocher qui pourrait être câblé à une pièce du modèle. Par exemple, quelque chose comme ceci:

text alt

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). Les points de bonus si je peux sélectionner plusieurs lignes, clic droit et choisissez « cocher / décocher la sélection ».

Si tout cela est peu clair, déposez un commentaire ici et je vais préciser.

Était-ce utile?

La solution

La mise en œuvre de votre propre modèle de table est plus de travail que d'utiliser QStandardItemModel (comme @Andy recommande), mais il vous donne un contrôle précis sur ce que vous voulez faire, donc je vais essayer de vous donner un résumé de ce qu'il faut faire . Je suppose que vous savez tout sur documentation de Qt et documentation de la classe de PyQt et peut regarder ce que 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 que d'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 courte que d'une seule ligne.
      • data est l'endroit où les choses deviennent intéressantes. modèles Item stocker plusieurs champs différents (qui appelle Qt rôles ) et que le rendement data dépend de ce rôle qui est demandé. Notez que je parle des types de données de ce qui est de retour, mais il doit toujours être enveloppé dans QVariant.
        • Qt.DisplayRole est tout le texte est affiché dans les cellules du tableau. Ce sont vos données réelles, et est de loin le cas le plus courant (pour que ce soit le rôle par défaut).
        • Qt.CheckStateRole est un booléen. De retour Qt.Checked affiche une case cochée, et Qt.Unchecked retourne un un sans contrôle. Si tout ce que vous voulez une colonne pour contenir est des cases à cocher ne gèrent que ce rôle.
        • Les autres rôles sont utiles pour les icônes, les couleurs d'arrière-plan, et un certain nombre d'autres fonctionnalités, mais ceux-ci.
        • Tout rôle unhandled doit retourner un QVariant.
      • setData est symétrique par rapport à data. Vous devez gérer les rôles que vous POIGNÉE 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 modèles de sélection . La version courte est:

  • Régler la mode de sélection votre point de vue de la table: view.setSelectionMode( QAbstractItemView.ContiguousSelection). Cela vous permettra de mettre en évidence les cellules contiguës. Vous pouvez mettre en évidence les cellules arbitraires ainsi. Voir QAbstractView.SelectionMode
  • Pour déterminer quelles cellules sont effectivement sélectionnées à la suite d'une action demande à la vue de la table pour son modèle de sélection (notez le l '): view.selectionModel().selectedIndexes(). Vous pouvez parcourir ces derniers avec une boucle de for.

Pour permettre un clic droit:

  • Remplacer la contextMenuEvent de votre point de vue.
  • Créer un QMenu et connectez-vous à ce que les fentes dont vous avez besoin.

Pour une compréhension plus approfondie lire Guide Qt au modèle / Voir si vous avez pas déjà. Et certainement regarder les exemples Qt vue de l'article . Un grand nombre de ceux décrirai sont mis en œuvre en PyQt dans beaucoup moins de code (y compris les deux @Jesse mentionne), et les exemples de modèles d'arbres portent sur des tables, mais avec beaucoup moins de travail (vous avez besoin de mettre en œuvre beaucoup moins, comme décrit ci-dessus.)

Autres conseils

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 ...

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:

Étoile délégué Exemple
Spin délégué Exemple de boîte

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top