2016-07-24 21 views
0

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.

+0

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

+0

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

+0

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

Antwort

0

Durch die Aktualisierung von Ubuntu 15.10 auf 16.04 wurde das Problem behoben.

Meine 16.04 Distro hat python3-pyqt5 und andere qt-Pakete mit Versionen rund um 5.5.1 - Ich habe überprüft, aber nicht gedacht, die Versionen dieser Pakete in meiner 15.10 Installation vor dem Abwischen notieren - aber Pakete. ubuntu.com sagt 5.4.2 ist die aktuelle Version für 15.10 und das klingt bekannt.

Wenn also noch jemand mit QT 5.4.2 auf dasselbe zugreift, kann ein Upgrade auf 5.5.1 einen Versuch wert sein - entweder durch Upgrade auf eine neuere Distribution oder durch einen Backport des neueren QT Ausführung.

Dank Ceppo93, war es eine gute Vermutung.