ПиQT:QTableWidget.setItemPrototype не работает?
Вопрос
В 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, похоже, не делают этого, поэтому вам нужно будет предотвратить сбор мусора прототипа.