2009-07-03 7 views
1

QTableWidgetでは、すべての値を小数点以下2桁までしか表示しません。そのために私は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

ここには2つの問題があります。 1つはコードに問題があり、もう1つはPyQtのバグかもしれません。あなたのデータ()メソッドの実装では

は、あなたはおそらくこれを書くことを意味:これはかなり新しいアイテムを作成し、そのデータメソッドを呼び出すよりも、スーパークラスのデータ()メソッドを呼び出します

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

あなたのダイアログを設定するとき、あなたはアイテムのプロトタイプへの参照を保持する必要がある場合があります

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

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

QtのドキュメントはPyQtはバインディング、試作品の所有権は、テーブルウィジェットに渡されることを言いますが、これを行うようには見えないので、プロトタイプがガベージコレクションされないようにする必要があります。

+0

ありがとうございました。 2つの訂正のために。今は完全に動作します。 – foobar

関連する問題