2009-07-03 5 views
1

QTableWidget에서 모든 소수점 두 자리로만 값을 표시하고 싶습니다. 이를 위해 QTableWidgetItem을 서브 클래 싱했습니다. PyQT : QTableWidget.setItemPrototype이 작동하지 않습니까?

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 메서드를 사용할 때 문제없이 작동합니다. 모든 힌트를 부탁드립니다.

답변

1

여기에는 두 가지 문제가 있습니다. 하나는 코드에 문제가 있거나 다른 하나는 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는 바인딩 이렇게하지 않으면 프로토 타입이 가비지 수집되지 않도록해야합니다.

+0

감사합니다. 두 가지 수정. 이제는 완벽하게 작동합니다. – foobar

관련 문제