2009-07-03 14 views
1

在一個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它沒有問題。任何提示都表示讚賞。

回答

1

這裏有兩個問題。一個可能是你的代碼有問題,另一個可能是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