我正在尝试使用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的教程或参考文献
答案 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会很有趣。 另外,我不确定这种事情是否有某种最佳实践。