PyQT:QTableWidget.setItemPrototype不工作?

问题描述:

在一个QTableWidget中,我想显示所有值只有两个小数位。为此我分类了QTableWidgetItem。PyQT:QTableWidget.setItemPrototype不工作?

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中的一个错误。

在您的数据()方法实现,您大概意思写:

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

这将调用父类的数据()方法,而不是创建一个新的项目,并调用其数据的方法。

当您设置对话框中,您可能需要将基准存到自己项目的原型:虽然Qt文档说原型的所有权被传递到表构件

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

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

,PyQt的绑定似乎没有这样做,所以你将需要防止垃圾收集原型。

+0

谢谢。对于两个更正。现在完美的工作。 – foobar 2009-07-14 10:16:19