2012-06-01 26 views
1

我想弄清楚如何在PyQt4.9.1中使用模型和視圖,並且遇到了一些問題。PyQt4.9.1視圖從不調用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() 

這裏是當我啓動我的應用程序的主窗口會發生什麼:沒有錯誤消息,該表繪製的行和列和正確的標題右側的號碼,但桌子是空的。您可能會注意到模型的繪製方法以打印語句開始。該聲明從未達到。有什麼我失蹤?對於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試圖實現我自己的樹模型的類似問題,但沒有QAbstractTreeModel可用...我將重新實現索引函數...我正在查找有關此信息,但任何提示將不勝感激。感謝您指出錯誤 – Sheena