pyqt : qtablewidget.setitemPrototyp가 작동하지 않습니까?
문제
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 바인딩은이 작업을 수행하지 않으므로 프로토 타입이 수집되는 것을 방지해야합니다.
제휴하지 않습니다 StackOverflow