2012-06-01 1 views
1

Я пытаюсь выяснить, как работать с моделями и представлениями в PyQt4.9.1, и я столкнулся с некоторой проблемой.PyQt4.9.1 view never calls model.data

Вот код, который имеет значение:

class TestModel(QtGui.QStandardItemModel): 
    def __init__(self,parent=None): 
     QtGui.QStandardItemModel.__init__(self,parent) 
     self.initData() 
     self.headings = ['name','value',''] 

    def initData(self): 
     self.rows = [['name {0}'.format(i), i] for i in range(20)] 

    def data(self, index, value, role): 
     print ("foo") 
     if not index.isValid(): 
      return 
     if (role == QtCore.Qt.DisplayRole): 
      row = index.row() 
      col = index.column() 
      if (col == 3): 
       return "BUTTON GOES HERE" 
     return self.rows[row][col] 

    def headerData(self,section,orientation,role): 
     if (role == QtCore.Qt.DisplayRole): 
      if (orientation == QtCore.Qt.Horizontal): 
       return self.headings[section] 

    def rowCount(self,parent): 
     return len(self.rows) 

    def columnCount(self,parent): 
     return 3 

class MainWindow(QtGui.QWidget): 
    def __init__(self): 
     super(MainWindow, self).__init__() 
     self.m = TestModel() 
     self.initUi() 

    def initUi(self): 
     layout = QtGui.QVBoxLayout() 
     widget = QtGui.QTableView() 
     widget.setModel(self.m) 
     layout.addWidget(widget) 
     self.setLayout(layout) 
     self.show() 

Вот что происходит, когда я запускаю MainWindow моего приложения: Там нет никаких сообщений об ошибках, таблица рисуется с правильным числом строк и столбцов и правильных заголовков, но таблица пуста. Вы можете заметить, что метод рисования модели начинается с заявления печати. Это утверждение никогда не достигается. Есть что-то, что мне не хватает? Я не могу найти какие-либо учебники вообще для PyQt4.9.1.

ответ

1

data() не имеет параметров value, но удаление его не решит проблему.

Виртуальный метод index(row, column, parent), который вызывается всякий раз, когда QModelIndex должен быть создан, всегда возвращает неверный индекс для QStandardItemModel, если только QStandardItem не был явно создан для запрошенного индекса. Представление, вероятно, не пытается отображать ячейки, когда индекс недействителен, поэтому data() никогда не вызывается.

Если вы держали унаследовав от QStandardItemModel, вам нужно будет переопределять index() создать действительные индексы, но так как вы используете свою собственную структуру для хранения данных вместо использования QStandardItem, вы могли бы просто наследовать от QtCore.QAbstractTableModel:

class TestModel(QtCore.QAbstractTableModel): 
    def __init__(self,parent=None): 
     super(TestModel, self).__init__(parent) 
     self.initData() 
     self.headings = ['name','value',''] 

    def initData(self): 
     self.rows = [['name {0}'.format(i), i] for i in range(20)] 

    def data(self, index, role): 
     if index.parent().isValid(): 
      return None    
     if (role == QtCore.Qt.DisplayRole): 
      row = index.row() 
      col = index.column() 
      # 3rd column index is 2 not 3 
      if (col == 2): 
       return "BUTTON GOES HERE" 
      # that return should also be "inside" the role DisplayRole 
      return self.rows[row][col] 
     return None 

    def headerData(self,section,orientation,role): 
     if (role == QtCore.Qt.DisplayRole): 
      if (orientation == QtCore.Qt.Horizontal): 
       return self.headings[section] 

Кроме того, вы должны возвращать только ненулевая строку/столбец подсчитывать для элементов верхнего уровня (один без родителей), если вы не представляющие дерева модели:

def rowCount(self,parent): 
     if not parent.isValid(): 
      return len(self.rows) 
     return 0 

    def columnCount(self,parent): 
     if not parent.isValid(): 
      return 3 
     return 0 
+0

Я предполагаю, что я бы иметь si milar проблемы с попыткой реализовать мою собственную модель дерева, но нет QAbstractTreeModel ... Я собираюсь пойти с переопределением функции индекса ... Я сейчас ищу информацию об этом, но любые советы будут оценены. Спасибо за указание ошибок – Sheena