1

在 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 方法时,它可以正常工作。任何提示表示赞赏。

4

1 回答 1

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 绑定似乎没有这样做,因此您需要防止原型被垃圾收集。

于 2009-07-12T15:28:09.917 回答