Pregunta

En un QTableWidget Quiero mostrar todos los valores únicamente con dos lugares decimales. Para que una subclase 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

He leído la documentación y estaba pensando que puedo usar algo como:

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

Pero esto choca más o menos al azar. Cuando utilizo el método self.table.setItem funciona sin problema. Alguna pista son apreciados.

¿Fue útil?

Solución

Hay dos cuestiones aquí. Uno puede ser un problema con el código, el otro puede ser un error en PyQt.

En los datos () implementación del método, es probable que significa que escribir esto:

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

Esto requiere los datos de la superclase () método en lugar de crear un nuevo elemento y llamando a su método de datos.

Cuando se configura el cuadro de diálogo, puede que tenga que mantener una referencia a su prototipo de elemento:

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

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

A pesar de que la documentación de Qt dice que la propiedad del prototipo se pasa al widget de tabla, las fijaciones de PyQt no parece que ello, por lo que necesitará para evitar el prototipo de ser basura recogida.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top