2009-07-03 2 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

Смежные вопросы