문제

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