Вопрос

В QTableWidget я хочу отображать все значения только с двумя знаками после запятой.Для этого я создал подкласс 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

Я прочитал документацию и подумал, что могу использовать что-то вроде:

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

Но это происходит более или менее случайно.Когда я использую метод self.table.setItem, он работает без проблем.Любые подсказки приветствуются.

Это было полезно?

Решение

Здесь есть две проблемы.Одна из них может быть проблемой вашего кода, другая — ошибкой в ​​PyQt.

В реализации метода data() вы, вероятно, хотели написать следующее:

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

При этом вызывается метод data() суперкласса, а не создание нового элемента и вызов его метода данных.

Когда вы настраиваете диалоговое окно, вам может потребоваться сохранить ссылку на прототип вашего элемента:

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

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

Хотя в документации Qt говорится, что право собственности на прототип передается виджету таблицы, привязки PyQt, похоже, не делают этого, поэтому вам нужно будет предотвратить сбор мусора прототипа.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top