从 QAbstractListModel 中获取所选项目

小丑马提尼

如何从包含自定义排序算法的自定义 QAbstractListModel 中检索正确选择的项目?

您可以通过在 UI 中进行选择并查看控制台来测试该工具。您可以看到它为所选项目打印了错误的信息。

我假设问题与我如何使用选择索引来获取模型中的项目有关。

在此处输入图片说明

完整代码:

import os, sys
from PySide import QtGui, QtCore


class ExplorerItem(object):
    def __init__(self, name, tags):
        self.name = name
        self.tags = tags


class ElementModel(QtCore.QAbstractListModel):
    TagsRole = QtCore.Qt.UserRole + 1
    NameRole = QtCore.Qt.UserRole + 2

    def __init__(self, *args, **kwargs):
        QtCore.QAbstractListModel.__init__(self, *args, **kwargs)
        self._items = []
        self._icons = {}

    def rowCount(self, index=QtCore.QModelIndex()):
        return len(self._items)

    def addItem(self, item):
        self.beginInsertRows(QtCore.QModelIndex(), self.rowCount(), self.rowCount())
        self._items.append(item)
        self.endInsertRows()

    def getItem(self, index):
        row = index.row()
        if index.isValid() and 0 <= row < self.rowCount():
            return self._items[row]

    def data(self, index, role=QtCore.Qt.DisplayRole):
        if not index.isValid():
            return None
        if 0 <= index.row() < self.rowCount():
            item = self._items[index.row()]
            if role == ElementModel.TagsRole:
                return item.tags
            elif role == ElementModel.NameRole:
                return item.colors
            elif role == QtCore.Qt.DisplayRole:
                return item.name
            elif role == QtCore.Qt.TextAlignmentRole:
                return QtCore.Qt.AlignCenter


class ExplorerSortModel(QtGui.QSortFilterProxyModel):

    def __init__(self, *args, **kwargs):
        super(ExplorerSortModel, self).__init__(*args, **kwargs)
        self._patterns = {}
        self.setDynamicSortFilter(True)
        self.setSourceModel(ElementModel())
        self.sort(0, QtCore.Qt.AscendingOrder)


    def set_pattern(self, role, value):
        self._patterns[role] = value


    def lessThan(self, left, right):
        leftData = self.sourceModel()._items[left.row()]
        rightData = self.sourceModel()._items[right.row()]

        if leftData and rightData:
            l = getattr(leftData, 'name', '')
            r = getattr(rightData, 'name', '')
            return l > r

        return True


    def filterAcceptsRow(self, sourceRow, sourceParent):
        sm = self.sourceModel()
        ix = sm.index(sourceRow)
        if ix.isValid():
            val = True
            for role, fvalue in self._patterns.items():
                value = ix.data(role)
                val = val and self.filter(value, fvalue, role)
            return val
        return False


    @staticmethod
    def filter(value, fvalue, role):
        '''
        fvalue: search value
        value: properties value being tested
        '''
        if role == ElementModel.TagsRole:
            if fvalue == []:
                return True
            else:
                return all(any(x in y for y in value) for x in fvalue)
        elif role == ElementModel.NameRole:
            return True
        else:
            return False


class QExplorerWidget(QtGui.QWidget):

    def __init__(self, *args, **kwargs):
        super(QExplorerWidget, self).__init__(*args, **kwargs)
        self.resize(400,400)

        # control
        self.ui_explorer = QtGui.QListView()
        self.ui_explorer.setResizeMode(QtGui.QListView.Adjust)
        self.ui_explorer.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers)
        self.ui_explorer.setMovement(QtGui.QListView.Static)
        self.ui_explorer.setSpacing(10)

        self.explorer_model = ExplorerSortModel()
        self.ui_explorer.setModel(self.explorer_model)

        self.ui_explorer_selection = self.ui_explorer.selectionModel()

        lay = QtGui.QVBoxLayout()
        lay.addWidget(self.ui_explorer)
        self.setLayout(lay)

        # connections
        self.ui_explorer_selection.selectionChanged.connect(self.changed_selection)

        # test data
        self.explorer_model.sourceModel().addItem(ExplorerItem('John',['john','sports']))
        self.explorer_model.sourceModel().addItem(ExplorerItem('Apple',['apple','fruit']))
        self.explorer_model.sourceModel().addItem(ExplorerItem('Kevin',['kevin','money']))
        self.explorer_model.sourceModel().addItem(ExplorerItem('Zoo',['zoo','animals']))


    def changed_selection(self):
        indexes =  self.ui_explorer_selection.selectedIndexes()
        for index in indexes:
            item = self.explorer_model.sourceModel().getItem(index)
            print item.name, item.tags, index


if __name__ == '__main__':
    ''
    app = QtGui.QApplication(sys.argv)
    ex = QExplorerWidget()
    ex.show()
    sys.exit(app.exec_())
埃利亚内斯克

所述QModelIndexselectedIndexes属于成立于认为,在这种情况下,它是在该模型ExplorerSortModel,以便这些索引不能被直接传递到getItem()因为该方法预计,ElementModel的方法QModelIndex属于ElementModel

在你的情况,你必须转换是QModelIndex属于ExplorerSortModel到相应的QModelIndex属于ElementModel使用mapSource()方法。

def changed_selection(self):
    indexes =  self.ui_explorer_selection.selectedIndexes()
    for index in indexes:
        ix_source = self.explorer_model.mapToSource(index)
        item = self.explorer_model.sourceModel().getItem(ix_source)
        print(item.name, item.tags)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从QAbstractListModel删除项目后QML崩溃

来自分类Dev

在QML中对QAbstractListModel进行过滤/排序

来自分类Dev

在QML中对QAbstractListModel进行过滤/排序

来自分类Dev

使用QAbstractListModel从python访问QML中的列表元素

来自分类Dev

如何根据QML中不同的QAbstractListModel的元素实现列表?

来自分类Dev

在 QML 的 QAbstractListModel 子类中实现活动项功能

来自分类Dev

QQmlListProperty与QAbstractListModel

来自分类Dev

在带有QAbstractListModel的默认QListView中绘制项目的“图标”空间?

来自分类Dev

获取jcombobox所选项目

来自分类Dev

无法获取所选项目

来自分类Dev

将新项目添加到基于QAbstractListModel的模型时,QML视图不会更新

来自分类Dev

在longlistselector中获取所选项目的索引

来自分类Dev

在下拉列表中获取所选项目的值

来自分类Dev

如何在QTreeView中获取所选项目

来自分类Dev

从操作栏微调器导航中获取所选项目

来自分类Dev

如何在textview中获取alertdialg所选项目?

来自分类Dev

在$ _POST中获取所选项目的值

来自分类Dev

从列表框中获取所选项目

来自分类Dev

在动态单选按钮中获取所选项目

来自分类Dev

如何在textview中获取alertdialg所选项目?

来自分类Dev

如何在KnockoutJS中获取所选项目的ID

来自分类Dev

如何从QT中的QListView获取所选项目的文本?

来自分类Dev

如何从LibGDX列表中获取所选项目?

来自分类Dev

获取所选项目在Android弹出菜单类中的位置

来自分类Dev

在PowerShell中获取所选项目的路径

来自分类Dev

如何在 React Native 的 RadioGroup 中获取所选项目?

来自分类Dev

将QML中对象的QAbstractListModel派生列表模型成员绑定为Q_PROPERTY

来自分类Dev

从QAbstractListModel删除行

来自分类Dev

在ListView中使用QAbstractListModel

Related 相关文章

  1. 1

    从QAbstractListModel删除项目后QML崩溃

  2. 2

    在QML中对QAbstractListModel进行过滤/排序

  3. 3

    在QML中对QAbstractListModel进行过滤/排序

  4. 4

    使用QAbstractListModel从python访问QML中的列表元素

  5. 5

    如何根据QML中不同的QAbstractListModel的元素实现列表?

  6. 6

    在 QML 的 QAbstractListModel 子类中实现活动项功能

  7. 7

    QQmlListProperty与QAbstractListModel

  8. 8

    在带有QAbstractListModel的默认QListView中绘制项目的“图标”空间?

  9. 9

    获取jcombobox所选项目

  10. 10

    无法获取所选项目

  11. 11

    将新项目添加到基于QAbstractListModel的模型时,QML视图不会更新

  12. 12

    在longlistselector中获取所选项目的索引

  13. 13

    在下拉列表中获取所选项目的值

  14. 14

    如何在QTreeView中获取所选项目

  15. 15

    从操作栏微调器导航中获取所选项目

  16. 16

    如何在textview中获取alertdialg所选项目?

  17. 17

    在$ _POST中获取所选项目的值

  18. 18

    从列表框中获取所选项目

  19. 19

    在动态单选按钮中获取所选项目

  20. 20

    如何在textview中获取alertdialg所选项目?

  21. 21

    如何在KnockoutJS中获取所选项目的ID

  22. 22

    如何从QT中的QListView获取所选项目的文本?

  23. 23

    如何从LibGDX列表中获取所选项目?

  24. 24

    获取所选项目在Android弹出菜单类中的位置

  25. 25

    在PowerShell中获取所选项目的路径

  26. 26

    如何在 React Native 的 RadioGroup 中获取所选项目?

  27. 27

    将QML中对象的QAbstractListModel派生列表模型成员绑定为Q_PROPERTY

  28. 28

    从QAbstractListModel删除行

  29. 29

    在ListView中使用QAbstractListModel

热门标签

归档