首页 > 其他分享 >QSortFilterProxyModel和QTreeView排序功能

QSortFilterProxyModel和QTreeView排序功能

时间:2024-08-12 21:17:12浏览次数:12  
标签:排序 Qt QTreeView ui UserRole toString treeView QSortFilterProxyModel 排序功能

1、需求,创建一个树有多层结构,同一层按照插入顺序逆序排列;

 

ui.treeView->setHeaderHidden(true);     //tree widget头标题是否显示,此处隐藏标题
    //ui.treeWidget->header()->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);
    ui.treeView->header()->setSectionResizeMode(QHeaderView::ResizeToContents);
    //ui.treeView->header()->setSectionResizeMode(0, QHeaderView::ResizeToContents);
    ui.treeView->header()->setCascadingSectionResizes(false);
    ui.treeView->header()->setStretchLastSection(true);
    m_modelTree = new QStandardItemModel(ui.treeView);
    m_TreeDelegate = new TreeTaskDelegate(ui.treeView);
    connect(m_TreeDelegate, &TreeTaskDelegate::signalBtClicked, this, &TreeTaskList::SlotTreeBtClicked);
    connect(m_TreeDelegate, &TreeTaskDelegate::signalEditFinish, this, &TreeTaskList::SlotEditFinish);
    ui.treeView->setItemDelegate(m_TreeDelegate);
    m_proxyModel = new QSortFilterProxyModel(ui.treeView);
    m_proxyModel->setSourceModel(m_modelTree);
    ui.treeView->setModel(m_proxyModel);
    m_modelTree->setColumnCount(1);
//    ui.treeView->setSortingEnabled(true);
    //ui.treeView->sortByColumn(0,Qt::AscendingOrder);
    m_proxyModel->setSortRole(Qt::UserRole+1);
    m_proxyModel->sort(0, Qt::DescendingOrder);
    ui.treeView->setIconSize(QSize(24, 24));
    ui.treeView->setColumnWidth(0, 300);

上面设置了一个排序按照角色Qt::UserRole+1去排序,排序方式为逆序排序;插入排序之后可以实现自动排序的功能;创建item的时候把创建时间设置到角色Qt::UserRole+1中去,然后QSortFilterProxyModel就会自动按照这个角色的值进行排序

QStandardItem *topItem = new QStandardItem();
        topItem->setCheckable(true);
        QString path = info.value("path").toString();
        topItem->setData( info.value("createtime").toString(),Qt::UserRole+1);
        info.insert("treeItem", QVariant::fromValue<QStandardItem *>(topItem));
        topItem->setData(info,Qt::UserRole);

如果批量导入,创建时间相同时,没有勾选时排好序,但是点击勾选的时候会出现重新排序,勾选和未勾选的分开排序,勾选的项跑到最下面去了,这不是我想要的排序方式,于是又给时间后面加上了一个rowcount值,在时间相同的情况,rouwcount肯定不一样,所以排序就不会变动

QStandardItem* videoFileItem = new QStandardItem();
    videoFileItem->setCheckable(true);
    //videoFileItem->setText(0, caseInfo.value("createtime").toString());
    QString path = caseInfo.value("path").toString();
    videoTaskInfo.insert("treeItem", QVariant::fromValue<QStandardItem*>(videoFileItem));
    for (auto it = videoTaskInfo.begin(); it != videoTaskInfo.end(); it++)
    {
        caseInfo.insert(it.key(), it.value());
    }
    videoFileItem->setData( caseInfo,Qt::UserRole);
    videoFileItem->setData(caseInfo.value("createtime").toString()+"_"+QString::number(parant->rowCount()), Qt::UserRole+1);//时间相同时,勾选顺序会变动
    videoFileItem->setSizeHint( QSize(300, 40));QSortFilterProxyModel 

方法2

重写QSortFilterProxyModel的lessthan函数,可以实现多个条件或者计算复杂的排序;

bool QTreeTaskFilterProxyModel::lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const
{
    QString left = source_left.data(Qt::UserRole+1).toString();
    QString right = source_right.data(Qt::UserRole).toString();
    return left <= right;
}

 

标签:排序,Qt,QTreeView,ui,UserRole,toString,treeView,QSortFilterProxyModel,排序功能
From: https://www.cnblogs.com/bclshuai/p/18355752

相关文章

  • QStyledItemDelegate 和QTreeView实现鼠标hover消息
    1.QTreeView设置属性mousetracking和tablettracing 重写QStyledItemDelegate类,重写函数booleditorEvent(QEvent*event,QAbstractItemModel*model,constQStyleOptionViewItem&option,constQModelIndex&index);这个函数里可以处理鼠标hover和点击事件;boolTreeTas......
  • 如何利用PyQt实现列表添加删除排序功能?
    本文介绍如何实现列表增加删除和排序的功能,效果如下:1页面设计1.1列表#列表数据 self.list=['福宝','萌兰','金虎','蓝天']#创建四行一列标准数据模型self.mode=QStandardItemModel(4,1)#将数据中的列表项作为标准数据模型输出......
  • QTreeView 样式设置以及Checkbox复选框样式设置
    这种样式设置如下QTreeView{background:#303033;font-size:16px;color:rgba(255,255,255,1);border:0px;}QTreeView::item{background:#303033;height:40px;}QTreeView::branch{background:#303033;}QTreeView::item:hover{......
  • QListWidget实现内部拖动排序功能
    1.需求将QListWidget有很多的任务,需要拖动任务,手动进行排序,并且需要保存拖动之后的顺序,软件重新打开要是修改之后的顺序;(1)继承QListWidget,重写一个QListWidget自定义类#ifndefDROPLISTWIDGET_H#defineDROPLISTWIDGET_H#include<QListWidget>#include<QDropEvent>clas......
  • React中使用dnd-kit实现拖曳排序功能
    在React中使用`dnd-kit`库实现拖拽排序功能,你需要遵循以下步骤:1.**安装dnd-kit**:首先,确保你已经安装了`dnd-kit`库。如果还没有安装,可以通过npm或yarn来安装:  ```bash  npminstall@dnd-kit/core  ```2.**引入必要的组件和钩子**:从`dnd-kit`中引入`Draggable`、`DragO......
  • JDK 8 之后可以使用更加简单的方法 Stream 流来实现排序功能
    //创建并初始化ListList<Person>list=newArrayList<Person>(){{add(newPerson(1,30,"张三"));add(newPerson(2,20,"李四"));add(newPerson(3,40,"王五"));}};......
  • C# Winform之propertyGrid控件分组后排序功能
    在WinForms的PropertyGrid控件中,你可以通过多种方式对属性进行排序,包括按类别(Category)排序以及按属性名称排序。默认情况下,PropertyGrid控件会根据[Category]和[DisplayName]属性装饰器对属性进行分组和排序。如果你想要自定义排序规则,你可以通过以下几种方法:使用......
  • C#实现禁用DataGridView控件列表头自动排序功能 (附完整源码)
    C#实现禁用DataGridView控件列表头自动排序功能代码说明:在C#中,可以通过设置DataGridView控件的列的SortMode属性来禁用列头的自动排序功能。以下是一个完整的示例代码,展示了如何实现这一功能:usingSystem;usingSystem.Windows.Forms;​namespace......
  • Qt QTreeView 常见节点操作
    QTreeView作为项目最经常使用的空间,常用接口和操作必须熟悉熟悉在熟悉!!!1、节点遍历1voidParamSettingDlg::GetNode()2{3for(inti=0;i<model->rowCount();i++)4{5QStandardItem*item=model->item(i);67qDebug()<<"item......
  • Android 13.0 Launcher3单层模式workspace中app列表页排序功能实现
    1.概述在13.0的定制化开发中,对于Launcher3的功能定制也是好多的,而对于单层app列表页来说排序功能的开发,也是常有的功能这就需要了解加载app数据的流程,然后根据需要进行排序就可以了,接下来就来实现这个功能如图:2.Launcher3单层模式workspace中app列表页排序功能实现的核心......