Domanda

In un QTableWidget Voglio visualizzare tutti i valori solo con due posti decimali. Per questo ho sottoclasse 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

Ho letto la documentazione e pensavo che posso usare qualcosa come:

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)
         ....

Ma questo si blocca più o meno casualmente. Quando uso il metodo self.table.setItem funziona senza problemi. Eventuali suggerimenti sono apprezzati.

È stato utile?

Soluzione

Ci sono due problemi qui. Uno può essere un problema con il codice, l'altro può essere un bug in PyQt.

i dati () implementazione del metodo, probabilmente significava a scrivere questo:

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

Ciò richiede i dati della superclasse () metodo, piuttosto che la creazione di un nuovo elemento e chiamando il suo metodo di dati.

Quando si imposta il dialogo, potrebbe essere necessario mantenere un riferimento al prototipo oggetto:

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

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

Anche se la documentazione Qt dice che la proprietà del prototipo viene passato al widget di tavolo, le associazioni PyQt non sembrano fare questo, quindi sarà necessario per evitare che il prototipo di essere garbage collection.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top