質問

QTableWidgetでは、私は2つのだけ小数点以下の桁ですべての値を表示したいです。そのために私は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それは問題なく動作します。任意のヒントが高く評価されます。

役に立ちましたか?

解決

ここでは2つの問題があります。一つは、他のは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はバインディングはこれを行うには表示されませんので、あなたは、ごみ収集されてからプロトタイプを防ぐために必要になります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top