Einbetten einer Steuerung in einem QTableView?
Frage
Ich arbeite einen kleinen qt-App (mit PyQt4) und ich habe mit einer Idee kommen, aber ich bin nicht sicher, wie es zu implementieren. Ich habe einen QTableView, dass einige Daten darstellt, und ich möchte eine andere Spalte zum QTableView hinzuzufügen, die ein Checkbox-Steuerelement enthält, das zu einem gewissen Stück des Modells verdrahtet werden. Zum Beispiel, so etwas wie folgt aus:
Beachten Sie die Spalte Löschen eine Checkbox-Widget für jede Zeile hat (obwohl dies eine Web-App ist, nicht ein Desktop-Qt-Anwendung, die Haupt die gleiche ist). Bonuspunkte, wenn ich mehrere Zeilen, die rechte Maustaste auswählen, und wählen Sie „Aktivieren / Deaktivieren ausgewählt“.
Wenn irgendetwas davon unklar ist, fällt hier einen Kommentar und ich werde klären.
Lösung
Ihr eigenes Tischmodell Implementierung ist mehr Arbeit als QStandardItemModel
mit (als @Andy empfiehlt), aber es gibt Ihnen eine feine Kontrolle darüber, was Sie tun möchten, also werde ich versuchen, Ihnen eine Zusammenfassung dessen, was zu tun . Ich nehme an, Sie wissen alles über Qt-Dokumentation und Auswahlmodelle . Die kurze Version ist:
- Stellen Sie die Auswahlmodus auf dem Tisch Ansicht:
view.setSelectionMode( QAbstractItemView.ContiguousSelection
). Auf diese Weise können Sie zusammenhängende Zellen markieren. Sie können beliebige Zellen als auch hervorzuheben: s.QAbstractView.SelectionMode
- Um festzustellen, welche Zellen im Anschluss an eine Aktion tatsächlich ausgewählt fragen die Tabellenansicht für die Auswahlmodell (Beachten Sie die 'l' ):
view.selectionModel().selectedIndexes()
. Sie können mit einerfor
Schleife durch diese durchlaufen.
Damit die rechte Maustaste:
- Ignoriere Ihre Ansicht des
contextMenuEvent
. - Erstellen Sie eine
QMenu
und schließen Sie es an, was auch immer Slots, die Sie benötigen.
Für eine tiefer gehende Verständnis lesen Sie die Qt Leitfaden für Modell / Blick , wenn Sie nicht bereits haben. Und schauen Sie auf jeden Fall auf die Qt Artikel Ansicht Beispiele . Viele von denen, sind beschreiben in PyQt in viel weniger Code (einschließlich der zwei @Jesse erwähnt) und die Baummodell Beispiele tragen über Tabellen, aber mit viel weniger Arbeit umgesetzt (Sie brauchen viel weniger zu implementieren, wie oben beschrieben).
Andere Tipps
Sie können auch einen Blick auf die QStandardItemModel haben, mit dem Sie eine Schnittstelle gibt mit Gegenständen durch einen „überprüfbar“ Zustand interact!
Sie können auch von QAbstractItemModel erben und verwenden Sie die Rolle Qt :: CheckStateRole ...
In Qt / C ++ können Sie einen Delegaten für benutzerdefinierte Elemente in einer Spalte erstellen. Ich würde annehmen, dass Sie etwas sehr ähnliches in PyQt tun können. Siehe folgende Beispiele: