2016-05-31 7 views
2

Was ich bisher getan haben:Tabelle bearbeiten in PyQt QAbstractTableModel ohne Löschen von Inhalten

ich Implementierung eines benutzerdefinierten QAbstractTableModel (verwendet in einer QTableView -Widget), die bearbeitbare Zellen enthält. Die Eigenschaften dieser Zellen werden in meiner flags() Methode angegeben, die wie folgt aussieht:

def flags(self, index): # Qt was imported from PyQt4.QtCore 
    if index.column() < 2: 
     return Qt.ItemIsEditable | Qt.ItemIsEnabled | \ 
       Qt.ItemIsSelectable 
    else: 
     return Qt.ItemIsEnabled | Qt.ItemIsSelectable 

Zellen in den ersten beiden Spalten sind markiert als editierbare wie ich will.

Was ich tun möchte:

jedoch, wenn die doppelte Zelle Klicken auf die Bearbeitung der enthaltene Text auszulösen gelöscht und ein leeres Feld angezeigt.

Example of editing a cell

Aber ich will nicht löschen & den enthaltenen Text ersetzen, da der enthaltene Text sehr lang sein könnte und sollte nicht abgetippt werden. Ich möchte nur bearbeiten, was bereits enthalten ist. Wenn Sie auf die Zelle doppelklicken, sollte sie mit dem zuvor enthaltenen Text bearbeitet werden können (möglicherweise bereits ausgewählt).

Die Frage:

Wie kann ich dieses Verhalten erreichen? Muss ich meine Flags-Methode bearbeiten und unterschiedliche Eigenschaften für diese Zellen angeben?

Antwort

2

Sie haben ein paar Optionen.

Während der Bearbeitung werden keine Daten in den Zellen angezeigt, da Sie wahrscheinlich für jedes Element in Ihrem Modell keine Daten für Qt.EditRole festgelegt haben. Die QTableWidget 's tun dies als Standard.

Eine andere Möglichkeit, dies zu tun, ist die Verwendung eines QItemDelegate. Dadurch können Sie das Editor-Widget manuell erstellen und initialisieren, bevor es in QTableView erscheint. Sie können den Anzeigerollen-Text verwenden, wenn der Bearbeitungstext nicht ausgefüllt wurde.

class MyDelegate(QtGui.QItemDelegate): 

    def createEditor(self, parent, option, index): 
     if index.column() == 2: 
      return super(MyDelegate, self).createEditor(parent, option, index) 
     return None 

    def setEditorData(self, editor, index): 
     if index.column() == 2: 
      # Gets display text if edit data hasn't been set. 
      text = index.data(Qt.EditRole) or index.data(Qt.DisplayRole) 
      editor.setText(text)   

delegate = MyDelegate() 
tableview.setItemDelegate(delegate) 
+0

Vielen Dank. Ich habe Ihren zweiten Ansatz mit 'QItemDelegate' versucht und es funktioniert genauso wie beabsichtigt. Wenn ich die 'Qt.EditRole' einstellen wollte, ohne die Klasse zu benutzen, wie würde ich das machen? Muss ich eine neue Methode in meinem benutzerdefinierten 'TableModel' definieren? – aisen

+0

Ich glaube nicht, dass Sie in Ihrem Modell etwas tun sollten. Es ist jedoch fraglich, warum Sie ein benutzerdefiniertes Modell erstellen müssen. Funktioniert 'QStandardItemModel' nicht? Wenn Sie nur Flags steuern möchten, können Sie diese beim Erstellen der Elemente festlegen. Es muss keine dynamische Funktion für das Modell sein. –

+0

Nun, ich finde nur heraus, wie man mit PyQt alles macht und wusste nicht einmal, dass es so etwas wie eine Standardklasse gibt. Ich werde es nachsehen. – aisen

Verwandte Themen