Ich bin zum ersten Mal mit Tabellen in PyQt rum und habe ein unerwartetes Verhalten beim Bearbeiten von Zellenwerten.PyQt5 QTableView-Zellbearbeitungsverhalten - Überlagerung des ursprünglichen Wertes
Speziell, wenn ich Daten eintippe, erscheint es über den vorhandenen Zellendaten (wenn also die Zelle ursprünglich '123' enthielt und ich '456' eingab, endete ich mit 2 Mengen von 3 Zeichen, eins über dem anderen - zumindest bis ich Enter drücke.
Nur um klar zu sein, ich habe keine Probleme mit SetData schreiben die Änderungen an dem Modell, oder mit den Änderungen in der Tabelle widergespiegelt, nachdem die Bearbeitung abgeschlossen ist - das ist alles in Ordnung passiert. Das einzige Problem ist, dass der ursprüngliche Wert und der neue Wert, den ich eintippe, den gleichen Platz belegen, bis die Bearbeitung beendet ist.
So vermutlich, was ich tun möchte, ist meine vorhandenen Daten Methode ändern:
def data(self, index, int_role=None):
row = index.row()
column = index.column()
if int_role == QtCore.Qt.DisplayRole:
return str(self._data[row][column])
elif int_role == QtCore.Qt.EditRole:
return str(self._data[row][column])
else:
return None
so dass sie erkennt, irgendwie, wenn die Zelle, um sie für die Daten zur Verfügung zu stellen (in DisplayRole Modus) gefragt wird wird gerade bearbeitet wird, und wenn dies der Fall ist, geben Sie anstelle der eigentlichen Daten eine leere Zeichenfolge zurück (da der Zweig "EditRole" des Codes ebenfalls zur gleichen Zeit aufgerufen wird und die Anzeigeaufgaben bis zur Beendigung der Bearbeitung problemlos erfüllt).
Ich habe mir die QT-Dokumente angeschaut, kann aber nicht herausfinden, wie das geht.
Edit: Nach ceppo Kommentare habe ich sah einen neuen ItemDelegate zu schaffen - aber looking into it further es sah aus wie ich in der Lage wäre, die itemEditorFactory in dem bestehenden stattdessen wechseln aus - speziell habe ich folgendes zu meinem Code:
newEditor = QLineEdit()
newEditor.setAutoFillBackground(True)
ief = QItemEditorFactory()
ief.registerEditor(QVariant.String, LineEditorCreator())
tableView.itemDelegate().setItemEditorFactory(ief)
mit LineEditorCreator wie folgt definiert:
class LineEditCreator(QItemEditorCreatorBase):
def __init__(self):
QItemEditorCreatorBase.__init__(self)
def createWidget(self, parent):
wdgt = QLineEdit(parent)
wdgt.setAutoFillBackground(True)
return wdgt
def valuePropertyName(self):
return "String"
aber jetzt habe ich einen Segmentation fault, sobald ich versuche, einen Zellwert zu bearbeiten. Das Einfügen einer print-Anweisung als erste Zeile in der createWidget-Anweisung zeigt, dass sie nicht ausgeführt wird - einige print-Anweisungen im createWidget zeigen, dass die Segmentierungsfehler auftreten, noch bevor die erste Zeile von createWidget ausgeführt wird (obwohl die __ init __-Methode ordnungsgemäß abgeschlossen wird). .
Ceppo sagte auch, dass das Verhalten, das ich erfahre, auf einen Fehler zurückzuführen sein könnte (in Qt, PyQt oder etwas anderes) - ich werde bald meine aktuelle Ubuntu 15.10 Installation mit 16.04 ersetzen, also mit etwas Glück löse das Problem vollständig.
Wahrscheinlich ein Problem mit dem Editor Hintergrund, versuchen Sie, eine 'BackgroundRole' hinzuzufügen und eine Farbe (z. B. rot) zurück, wenn der Editor einen transparenten Hintergrund haben, wenn Sie diese Farbe bearbeiten. – Ceppo93
Ich habe eine weitere Elif-Verzweigung zu der Klausel für 'int_role == QtCore.Qt.BackgroundRole' hinzugefügt und' return QColor (255,0,0,255) 'darin hinzugefügt - dies schaltet den Hintergrund für alle Zellen tatsächlich rot, die ganze Zeit, ob sie bearbeitet werden oder nicht - aber das hilft nicht wirklich dabei, den Zellinhalt unsichtbar zu machen, während der Editor sichtbar ist. Ich verstehe, dass, wenn ich den Hintergrund des Herausgebers als Farbe des Fensterhintergrunds einstellen kann, aber ich weiß nicht, wie man die Hintergrundfarbe des Herausgebers in der EditRole-Verzweigung einstellt (oder wie man den Herausgeber überhaupt referenziert). – Blair
Es war die Wurzel des Problems zu finden (vielleicht ein Fehler in Ihrer Qt-Version? Ich habe dieses Problem nicht);) Wie auch immer, Sie können nicht den Hintergrund des Editors direkt aus dem Modell ändern, aber Sie können eine einfache ' LineEdit 'Editor-Delegate und dann können Sie die Lösung hier finden: http://stackoverflow.com/questions/22805756/make-item-delegate-in-qtableview-not-transparent/22806076 – Ceppo93