在一个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它的工作原理没有问题。任何提示赞赏。

有帮助吗?

解决方案

这里有两个问题。一个可以是与你的代码中的问题,而另一个可以在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