2016-03-24 8 views
-2

Ich habe ein QTableWidget und möchte Elemente auswählbar abhängig davon, was bereits ausgewählt ist (nur wenn sie den gleichen Inhalt in der zweiten Spalte haben).Wie kann man nur bestimmte Elemente in einem QTableWidget mehrfach auswählen lassen?

Ich weiß, wie Sie Elemente auswählbar machen oder nicht. Aber alles sollte auswählbar bleiben, so dass der Benutzer ein einzelnes Element auswählen kann, um die Auswahl frisch zu starten. Wenn Sie nur eine Auswahl hinzufügen, indem Sie shift oder ctrl gedrückt halten, sollten Sie nur geeignete Elemente zulassen/auswählen.

Wo kann ich einhaken, um das Hinzufügen zu einer Auswahl nur mit geeigneten Zeilen zu akzeptieren?

Hinweis: Ich verwende PySide, aber ich kann von C++ oder PyQt-Code gut funktionieren.

+0

Vielleicht können Sie es tun Unterklassen QItemSelectionModel – Fabio

+0

Und dann? Das Überladen von Select kann mich auf die Hälfte bringen, aber im Idealfall möchte ich nicht, dass Elemente angezeigt werden, wenn der Mauszeiger über sie bewegt wird, wenn shift ctrl gedrückt wird. Das Ändern des ItemIsSelectable-Flags jedes Mal, wenn ctrl/shift gedrückt wird, scheint schlecht zu sein. –

+1

Was meinst du mit "Elemente sind auswählbar, wenn die Maus über ihnen schwebt"? Es scheint mir nicht, dass es einen Unterschied zwischen auswählbaren und nicht auswählbaren Elementen gibt, wenn der Mauszeiger darüber bewegt wird. Ich denke, Sie können die beiden'Auswahl'-Methoden von 'QItemSelectionModel' überlasten und die Elemente entsprechend den bereits ausgewählten Elementen auswählen (aber nicht sicher, ich habe noch nie so etwas getan) – Fabio

Antwort

-1

Sie können eine Verbindung zum QTableWidget.itemSelectionChanged Signal herstellen und die Qt.ItemIsSelectable Flags aller anderen Elemente in der Tabelle basierend auf der Auswahl ändern.

from itertools import product 

table = QtGui.QTableWidget() 
table.itemSelectionChanged.connect(self.on_itemSelectionChanged) 

@QtCore.pyqtSlot() 
def on_itemSelectionChanged(self): 
    sel_items = self.table.selectedItems() 

    # get all items in table 
    items = [] 
    for r, c in product(range(self.table.rowCount()), range(self.table.columnCount())): 
     items.append(self.table.item(r, c) 

    # Loop through all the items in the table and 
    # set the selection flag based of already selected items. 
    for item in items: 
     if can_be_selected: 
      item.setFlags(item.flags() | QtCore.Qt.ItemIsSelectable) 
     else: 
      item.setFlags(item.flags() & ~QtCore.Qt.ItemIsSelectable) 
+0

Dann können Sie (ohne Shift oder Strg) kein neues Element auswählen, um die aktuelle Auswahl zu ersetzen. Das "can_be_selected" hängt davon ab, ob die aktuelle Auswahl ersetzt oder erweitert wird. –

+0

Sie müssen nur Ihre aktuelle Auswahl aufheben, bevor Sie eine neue Auswahl treffen. –

Verwandte Themen