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

时间:2012-10-14 14:06:24

标签: python qt sorting pyside qlistview

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

基本上我正在尝试做的是:

  1. 检测照片集中的面孔并将其显示在QListView
  2. 对面部进行聚类(图像)
  3. 通过将属于同一群集的列表中的项目(即面部图像)放在一起来更新视图。具体地说,如果项目1,3,5在一个群集中而项目2,4,6在另一个群集中,则在显示项目2,4,6中的任何项目之前应显示项目1,3,5(以任何排列)反之亦然。
  4. 我这样做的方法是将列表中每个UserRole的{​​{1}}字段之一设置为群集标签,然后尝试按QStandardItem进行排序对此QStandardModel。然后,这将显示彼此相邻的同一群集中的项目(即,UserRole中具有相同的群集标签)。

    我能够为项成功设置UserRole但是调用UserRole上的sort函数没有对项进行排序,即使我将排序角色设置为默认值{{ 1}}(即按照每张脸的文字标签排序)按预期工作。

    有人能告诉我我的代码有什么问题或提供替代方法吗?我用google搜索排序列表,我在QSortFilterProxyModel找到了以下链接,但由于我对Qt很新,我无法适应我的情况。

    预先感谢任何回复。

    以下是相关代码:

    QStandardModel

1 个答案:

答案 0 :(得分:1)

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

以下是使用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_())