1 Star 2 Fork 0

透明2002/PyQt

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

QListView

1、显示自定义Widget

运行 CustomWidgetItem.py

通过设置 setIndexWidget(QModelIndex, QWidget) 可以设置自定义 QWidget

CustomWidgetItem

2、显示自定义Widget并排序

运行 CustomWidgetSortItem.py

  1. 对QListView设置代理 QSortFilterProxyModel
  2. 重写model的 lessThan 方法进行排序

CustomWidgetSortItem

3、自定义角色排序

运行 SortItemByRole.py

需求:

  1. 5种分类(唐、宋、元、明、清) 和 未分类
  2. 选中唐则按照 唐、宋、元、明、清、未分类排序
  3. 选中宋则按照 宋、唐、元、明、清、未分类排序
  4. 选中元则按照 元、唐、宋、明、清、未分类排序
  5. 取消排序则恢复到加载时候顺序,如:未分类、唐、唐、明、清、未分类、宋、元、未分类

思路:

  1. 定义IdRole = Qt.UserRole + 1 用于恢复默认排序
  2. 定义ClassifyRole = Qt.UserRole + 2 用于按照分类序号排序
  3. 定义5种分类的id
    NameDict = {
        '唐': ['Tang', 0],
        '宋': ['Song', 1],
        '元': ['Yuan', 2],
        '明': ['Ming', 3],
        '清': ['Qing', 4],
    }
    IndexDict = {
        0: '唐',
        1: '宋',
        2: '元',
        3: '明',
        4: '清',
    }
    
  4. item设置 setData(id, IdRole) 用于恢复默认排序
  5. item设置 setData(cid, ClassifyRole) 用于标识该item的分类
  6. 继承 QSortFilterProxyModel 增加 setSortIndex(self, index) 方法, 目的在于记录要置顶(不参与排序)的分类ID
    def setSortIndex(self, index):
        self._topIndex = index
    
  7. 继承 QSortFilterProxyModel 重写 lessThan 方法, 判断分类ID是否等于要置顶的ID, 如果是则修改为-1, 这样就永远在最前面
    if self.sortRole() == ClassifyRole and \
            source_left.column() == self.sortColumn() and \
            source_right.column() == self.sortColumn():
        # 获取左右两个的分类
        leftIndex = source_left.data(ClassifyRole)
        rightIndex = source_right.data(ClassifyRole)
    
        # 升序
        if self.sortOrder() == Qt.AscendingOrder:
            # 保持在最前面
            if leftIndex == self._topIndex:
                leftIndex = -1
            if rightIndex == self._topIndex:
                rightIndex = -1
    
            return leftIndex < rightIndex
    
  8. 恢复默认排序
    self.fmodel.setSortRole(IdRole)     # 必须设置排序角色为ID
    self.fmodel.sort(0)                 # 排序第一列按照ID升序
    
  9. 根据分类排序, 这里要注意要先通过 setSortRole 设置其它角色再设置目标角色
    self.fmodel.setSortIndex(1)
    self.fmodel.setSortRole(IdRole)
    self.fmodel.setSortRole(ClassifyRole)
    self.fmodel.sort(0)
    

SortItemByRole

马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/won2930015/PyQt.git
git@gitee.com:won2930015/PyQt.git
won2930015
PyQt
PyQt
master

搜索帮助