如何对多维模型进行排序

时间:2012-07-09 23:21:31

标签: model-view-controller qt pyqt4 pyside

我正在使用PySide编写一个插件浏览器。可用的插件存储在三维模型中,如下所示:

pluginType/pluginCategory/pluginName

e.g:

python/categoryA/toolA
python/categoryB/toolAA

在我的自定义视图中,我在列表中显示给定插件类型(即“python”)的所有工具,无论其类别如何:

(python)
categoryA/toolA
categoryA/toolB
categoryA/toolC
categoryB/toolAA
categoryB/toolBB
categoryB/toolCC

我现在想知道如何最好地对此视图进行排序,因此无论父类如何,工具都按名称排序。我当前的代理模型中的排序方法产生了一个排序列表,如上所述,但我所追求的是:

(python)
categoryA/toolA
categoryB/toolAA
categoryA/toolB
categoryB/toolBB
categoryA/toolC
categoryB/toolCC

我是否必须让我的代理模型将多维源模型转换为一维模型才能实现这一目标或有更好的方法吗?我希望能够将自定义视图与标准树视图同步,这就是我选择多维模型的原因。

谢谢, 坦率

编辑1: 以下是我的简化示例。我不确定这是否是这样的方法(将模型结构更改为一维模型),如果是,我不确定如何正确地在代理模型中创建数据,所以它是与预期的源模型链接。

import sys
from PySide.QtGui import *
from PySide.QtCore import *

class ToolModel(QStandardItemModel):
    '''multi dimensional model'''
    def __init__(self, parent=None):
        super(ToolModel, self).__init__(parent)
        self.setTools()

    def setTools(self):
        for contRow, container in enumerate(['plugins', 'python', 'misc']):
            contItem = QStandardItem(container)
            self.setItem(contRow, 0, contItem)
            for catRow, category in enumerate(['catA', 'catB', 'catC']):
                catItem = QStandardItem(category)
                contItem.setChild(catRow, catItem)
                for toolRow, tool in enumerate(['toolA', 'toolB', 'toolC']):
                    toolItem = QStandardItem(tool)
                    catItem.setChild(toolRow, toolItem)

class ToolProxyModel(QSortFilterProxyModel):
    '''
    proxy model for sorting and filtering.
    need to be able to sort by toolName regardless of category,
    So I might have to convert the data from sourceModel to a 1-dimensional model?!
    Not sure how to do this properly.
    '''
    def __init__(self, parent=None):
        super(ToolProxyModel, self).__init__(parent)

    def setSourceModel(self, model):
        index = 0
        for contRow in xrange(model.rowCount()):
            containerItem = model.item(contRow, 0)
            for catRow in xrange(containerItem.rowCount()):
                categoryItem = containerItem.child(catRow)
                for itemRow in xrange(categoryItem.rowCount()):
                    toolItem = categoryItem.child(itemRow)
                    # how to create new, 1-dimensional data for self?



app = QApplication(sys.argv)
mainWindow = QWidget()
mainWindow.setLayout(QHBoxLayout())

model = ToolModel()
proxyModel = ToolProxyModel()
proxyModel.setSourceModel(model)
treeView = QTreeView()
treeView.setModel(model)
treeView.expandAll()
listView = QListView()

listView.setModel(proxyModel)

mainWindow.layout().addWidget(treeView)
mainWindow.layout().addWidget(listView)
mainWindow.show()
sys.exit(app.exec_())

编辑: 或者也许我应该问如何最好地准备一个源模型,以便它可以被QTreeView使用,但也可以按上面提到的方式排序,以便在列表视图中显示?!

1 个答案:

答案 0 :(得分:0)

使用QTableView并通过tool_name列对其进行排序(使用排序代理)。