PyQt 5更新列表模型

时间:2017-05-18 09:56:45

标签: python-3.x qt qml pyqt5

我正在尝试使用python更新QML快速控件中的listview模型。此模型中的每个项目都包含address和状态property。现在我的代码是这样的:

的ListModel:

class ServersModel(QAbstractListModel):
    def __init__(self, parent=None):
        super(ServersModel, self).__init__(parent)
        self.list = []
        for address, status in (
            ("server 1", "green"),
            ("server 2", "green"),
            ("server 3", "red")):
            self.list.append(server(address, status))

    def rowCount(self, parent=QModelIndex()):
        return len(self.list)

    def data(self, index, role=None):
        if role == Qt.DisplayRole: #show just the name
            person = self.list[index.row()]
            return QVariant(person.name)
        elif role == Qt.UserRole:  #return the whole python object
            person = self.list[index.row()]
            return person
        return QVariant()

    def removeRow(self, position):
        self.list = self.list[:position] + self.list[position+1:]
        self.reset()

ServerObject:

class server(object):
    '''
    a custom data structure, for example purposes
    '''
    def __init__(self, address, status):
        self.address = address
        self.status = status
    def __repr__(self):
        return "%s\n%s"% (self.address, self.status)

Python连接处理程序:

class ServersListViewHandler(QObject):

def __init__(self):
    QObject.__init__(self)

listLoaded = pyqtSignal(QAbstractListModel, arguments=['model'])
data_changed = pyqtSignal(QModelIndex, QModelIndex)

# Slot for detecting clicks in listView
@pyqtSlot(str)
def listViewItemClicked(self, name):
    self.listLoaded.emit(ServersModel())

这是我在qml的连接:

Connections {
        target: serversListViewHandler

        onListLoaded: {
            serversListView.model = model
        }
    }

地址属性应该作为值转到文本,状态是圆的颜色。如果我直接将模型实现到QML,但我想动态更新它并从python加载它,这可以正常工作。有关如何实现这一目标的任何想法?我可能完全错了,但几乎没有关于pyqt 5的教程或参考文献

1 个答案:

答案 0 :(得分:0)

我目前正在进行类似的实验。我成功地通过使用列的专用角色名称(在我的情况下在列表视图中)。 对于你的例子,这有点像这样:

class ServersModel(QAbstractListModel):

     AddressRole = Qt.UserRole + 1
     StatusRole = Qt.UserRole + 2

    _roles = {AddressRole: b"address", StatusRole: b"status"}
    ...

    def roleNames(self):
        return self._roles

    def data(self, index, role=None):
        if role == AddressRole: #show just the name
            person = self.list[index.row()]
            return QVariant(person.name)
        elif role == StatusRole:  #return the whole python object
            person = self.list[index.row()]
            return person
        return QVariant()

虽然这可能只针对显示部分,而不是完整的更新程序。看到访问该模型的QML会很有趣。 另外,我不确定这种事情是否有某种最佳实践。