gpt4 book ai didi

python - 如何使用 Qt.UserRole 对 Qt QListview 中的项目进行排序

转载 作者:太空宇宙 更新时间:2023-11-03 19:11:27 26 4
gpt4 key购买 nike

我在使用我指定的字段中的值对 QListView 中的项目进行排序时遇到一些问题。

基本上我想做的是:

  1. 检测照片集中的人脸并将其显示在 QListView
  2. 对人脸(图像)进行聚类
  3. 通过将列表中属于同一集群的项目(面部图像)放在一起来更新 View 。具体来说,如果项目 1、3、5 在一个簇中,而项目 2、4、6 在另一个簇中,则应在显示项目 2、4、6 中的任何一个之前显示项目 1、3、5(以任何排列)反之亦然。

我执行此操作的方法是将列表中每个 QStandardItemUserRole 字段之一设置为集群标签,然后尝试获取 QStandardModel 根据此UserRole 进行排序。然后,这将显示同一集群中的项目(即在 UserRole 中具有相同的集群标签)。

我能够成功地为项目设置UserRole,但在QStandardModel上调用排序函数并没有对项目进行排序,即使当我设置排序角色时也是如此成为默认的 DisplayRole(即根据每个面孔的文本标签排序),它按预期工作。

谁能告诉我我的代码有什么问题或提供替代方法吗?我用谷歌搜索了排序列表,并在 QSortFilterProxyModel 上找到了以下链接但由于我对 Qt 还很陌生,所以我无法使其适应我的情况。

预先感谢您的回复。

相关代码如下:

import os
from PySide.QtGui import QListView, QStandardItemModel, QStandardItem, QIcon
from PySide.QtCore import Qt

class FacesView(QListView):
"""
View to display detected faces for user to see and label.
"""
UNCLUSTERED_LABEL = -1
CLUSTER_ROLE = Qt.UserRole + 1

def __init__(self, *args):
super(FacesView, self).__init__(*args)
self._dataModel = QStandardItemModel()
self.setModel(self._dataModel)
# Layout items in batches instead of waiting for all items to be
# loaded before user is allowed to interact with them.
self.setLayoutMode(QListView.Batched)

def updateFaceClusters(self, labels):
"""Update the cluster label for each face.
@param labels: [1 x N] array where each element is an integer
for the cluster the face belongs to."""

assert(len(labels) == self._dataModel.rowCount())
# Put the cluster label each item/face belong to in the
# CLUSTER_ROLE field.
for i in xrange(self._dataModel.rowCount()):
index = self._dataModel.index(i, 0)
self._dataModel.setData(index, labels[i], self.CLUSTER_ROLE)

# Use cluster label as sort role
self._dataModel.setSortRole(self.CLUSTER_ROLE)
# This does NOT seem to sort the items even though it works fine
# when sort role is the default Qt.DisplayRole.
self._dataModel.sort(0)
print("Finished updating face clusters")

def itemsInList(self):
"""Returns the label for a face and the path to its image.
@return: (label, path)"""
items = []
for i in xrange(self._dataModel.rowCount()):
label = self._dataModel.index(i, 0).data(Qt.DisplayRole)
imagePath = self._dataModel.index(i, 0).data(Qt.UserRole)
clusterLabel = self._dataModel.index(i, 0).data(self.CLUSTER_ROLE)
items.append((imagePath, label, clusterLabel))

return items

def addItem(self, label, imagePath):
"""Add an item to list view
@param label: The label associated with the item.
@param imagePath: Path to image for the icon."""
if os.path.exists(imagePath):
icon = QIcon(imagePath)
else:
icon = QIcon(':/res/Unknown-person.gif')

item = QStandardItem(icon, label)
item.setEditable(True)
# Add image path to the UserRole field.
item.setData(imagePath, Qt.UserRole)
# Add cluster label to image. CLUSTER_ROLE is where I intend
# to put the item's cluster label.
item.setData(self.UNCLUSTERED_LABEL, self.CLUSTER_ROLE)
# Prevent an item from dropping into another item.
item.setDropEnabled(False)
# Add item to list indirectly by adding it to the model.
self._dataModel.appendRow(item)

def clear(self):
self._dataModel.clear()

最佳答案

您发布的代码没有任何问题。所以一定是你的使用方式有问题。您如何生成集群标签?

这是一个使用 FacesView 类的测试脚本,可按您的预期进行排序:

from random import randint
from PySide.QtGui import QWidget, QPushButton, QVBoxLayout, QApplication
from facesview import FacesView

class Window(QWidget):
def __init__(self):
QWidget.__init__(self)
self.list = FacesView(self)
self.button = QPushButton('Test', self)
self.button.clicked.connect(self.handleButton)
layout = QVBoxLayout(self)
layout.addWidget(self.list)
layout.addWidget(self.button)

def handleButton(self):
labels = []
self.list.model().setRowCount(0)
for row in range(10):
labels.append(randint(0, 3))
text = 'Item(%d) - Cluster(%d)' % (row, labels[-1])
self.list.addItem(text, 'icon.png')
self.list.updateFaceClusters(labels)

if __name__ == '__main__':

import sys
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())

关于python - 如何使用 Qt.UserRole 对 Qt QListview 中的项目进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12882980/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com