Question

Dans un QTableWidget je veux afficher toutes les valeurs uniquement avec deux décimales. Pour que je QTableWidgetItem sous-classé.

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

J'ai lu la documentation et je pense que je peux utiliser quelque chose comme:

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

Mais cette plante plus ou moins au hasard. Lorsque j'utilise la méthode self.table.setItem cela fonctionne sans problème. Tous les conseils sont appréciés.

Était-ce utile?

La solution

Il y a deux questions ici. On peut être un problème avec votre code, l'autre peut être un bogue dans PyQt.

Dans votre implémentation de la méthode des données (), vous vouliez dire probablement écrire ceci:

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

Cette méthode appelle plutôt que de créer un nouvel élément et appelant les données () de la superclasse sa méthode de données.

Lorsque vous configurez votre boîte de dialogue, vous devrez peut-être conserver une référence à votre prototype d'article:

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

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

Bien que la documentation Qt dit que la propriété du prototype est passé au widget de table, les liaisons PyQt ne semblent pas faire cela, vous devrez éviter le prototype d'être des déchets collectés.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top