Frage

In einem QTableWidget ich möchte nur alle Werte angezeigt werden mit zwei Dezimalstellen. Dafür habe ich subclassed QTableWidgetItem.

class MyCell(QTableWidgetItem):
    def __init__(self, *args):
        QTableWidgetItem.__init__(self, *args)

    def clone(self):
        return MyCell()

    def data(self, role):
        t = QTableWidgetItem(self).data(role)
        if role == 0:
            if t.type() != 0:
                try:
                    a, b = str(t.toString()).split('.')
                    return QVariant( ".".join([a,b[:2]]))
                except:
                    return t
         return t

las ich die Dokumentation und dachte, dass ich so etwas wie verwenden kann:

class MyDialog(QDialog):
    def __init__(self, parent=None):
         super(MyDialog, self).__init__(parent)

         self.table = QTableWidget()
         acell = MyCell()
         self.table.setItemPrototype(acell)

         self.table.setRowCount(5)
         self.table.setColumnCount(5)
         ....

Aber diese Abstürze mehr oder weniger zufällig. Wenn ich die Methode verwenden self.table.setItem funktioniert es problemlos. Für Hinweise sind willkommen.

War es hilfreich?

Lösung

Es gibt zwei Probleme hier. Man kann ein Problem mit dem Code, der andere einen Fehler in PyQt sein kann.

Ihre Daten () -Methode Implementierung, werden Sie wahrscheinlich gemeint, dies zu schreiben:

def data(self, role):
    t = QTableWidgetItem.data(self, role)
    ...

Dies ruft die übergeordnete Klasse Daten () -Methode, anstatt ein neues Element zu schaffen und seine Daten-Methode aufrufen.

Wenn Sie Ihren Dialog einrichten, können Sie einen Verweis auf Ihren Artikel Prototyp halten müssen:

def __init__(self, parent=None):
    super(MyDialog, self).__init__(parent)

    self.table = QTableWidget()
    self.acell = MyCell()
    self.table.setItemPrototype(self.acell)

Auch wenn die Qt-Dokumentation sagt, dass das Eigentum des Prototyps an den Tisch Widget übergeben wird, die PyQt Bindungen erscheinen nicht, dies zu tun, so dass Sie den Prototyp verhindern, müssen aus seinem Müll gesammelt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top