在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方法时,它可以正常工作。任何提示都表示赞赏。
答案 0 :(得分:1)
这里有两个问题。一个可能是您的代码有问题,另一个可能是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绑定似乎没有这样做,所以你需要防止原型被垃圾收集。