2017-05-04 72 views
0

我想獲得一個自定義的ListModel工作,並顯示在PyQt。但是列表視圖總是空白。我檢查了UserModel.users確實有它應該有的項目,並且dataChanged正確啓動,但沒有任何顯示。 同時,數據中的print(index)不會輸出任何東西,所以模型數據永遠不會被調用? 我錯過了什麼?QListView拒絕顯示子類QAbstractListModel

self.userList = QtWidgets.QListView() 
    self.userList.setModel(self.main.commandHandler.userList) 
    self.userList.show() 

class UserModel(QAbstractListModel): 
    def __init__(self, parent=None): 
     QAbstractListModel.__init__(self, parent) 
     self.users = [] 

    def rowCount(self, parent = None) : 
     if parent != None: 
      return 0 
     return len(self.users) 

    def flags(self): 
     return Qt.NoItemFlags 

    def data(self, index, role = Qt.DisplayRole): 
     print(index) 
     name = self.users[index].name 
     if index.isValid(): 
      if (role == Qt.DisplayRole): 
       return QVariant(name) 
     else: 
      return QVariant() 

    def addUser(self, payload): 
     user = User(payload) 
     l = len(self.users) 
     self.users.append(user) 
     self.dataChanged.emit(self.index(l, 0), self.index(l, 0)) 

回答

0

你需要調用beginInsertRowsendInsertRows - dataChanged僅用於現有項目。

您可能想在您的模型上運行pytest-qt's modeltester以查找更多問題。

此外,請注意QStandardItemModelQStringListModel如果您的實際模型與您的示例一樣簡單,可能會更易於使用。

+0

我試着添加beginInsertRows和endInsertRows,它不會改變任何東西。至於嘗試pytestqt,測試人員似乎也有一些問題。它在hasIndex中返回一個錯誤,我不會覆蓋它,也不應該這樣做。 – user1787062

+0

你能用模型和你得到的確切錯誤打開[問題](https://github.com/pytest-dev/pytest-qt/issues)嗎? –