Pergunta

Em um QTableWidget eu quero mostrar todos os valores apenas com duas casas decimais. Para que eu subclasse 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

Eu li a documentação e estava pensando que eu posso 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)
         ....

Mas isso deixa de funcionar mais ou menos aleatoriamente. Quando eu uso o método self.table.setItem ele funciona sem problema. Quaisquer sugestões são apreciadas.

Foi útil?

Solução

Há duas questões aqui. Um pode ser um problema com o seu código, o outro pode ser um bug em PyQt.

Em seus dados () implementação do método, você provavelmente pretendia escrever isto:

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

Esta chama os dados da superclasse () método em vez de criar um novo item e chamando seu método de dados.

Quando você configurar sua caixa de diálogo, pode ser necessário para manter uma referência ao seu protótipo artigo:

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

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

Embora a documentação Qt diz que a propriedade do protótipo é passado para o widget de mesa, as ligações PyQt não aparecem para fazer isso, então você vai precisar para evitar o protótipo de ser lixo coletado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top