QTreeView置顶排序功能实现

1.需求描述

QTreeView先插入的排在上面,并支持手动置顶进行排序,取消置顶;

2.实现方案

(1)定义排序角色

给每一个插入的QStandardItem对象设置一个排序角色,我们用插入时间来设置这个值;

enum  CustomRole

{

    QOrderRole = Qt::UserRole + 1

};

构造函数中设置model的排序角色

m_modelTree->setSortRole(QOrderRole);

 

(2)处理排序逻辑

点击置顶按钮的时候,将时间加上100年,取消置顶按钮的时候,将时间减去100年,并将QstandardItemModel以这个时间逆序排序,这样置顶的item就会排在最上面;后置顶的排在最前面;置顶和取消置顶都会将时间更新到数据库,这样重新打开软件,依然保持着顺序;

if (bt== "Top")
        {
            QString strTop =caseinfo.value("top").toString();
            if (strTop=="1")//取消置顶
            {
                caseinfo.insert("top", "0");
                QString strTime = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz");
                caseinfo.insert("createtime", strTime);
                pItem->setData(strTime, QOrderRole);
                QString strSql = QString("update CaseManage set createtime = '%1' ,top='0' where path='%2'").arg(strTime).arg(caseinfo.value("path").toString());
                QString strmsg = "";
                QVariantMap result;
                LocalDb::instance()->ExcuateSql(strSql, result, strmsg);
                if (m_picPathDirInfo.find(caseinfo.value("path").toString()) != m_picPathDirInfo.end())
                {
                    m_picPathDirInfo[caseinfo.value("path").toString()]["createtime"] = strTime;
                    m_picPathDirInfo[caseinfo.value("path").toString()]["top"] = "0";
                }
                pItem->setData(caseinfo, Qt::UserRole);
            }
            else//置顶
            {
                caseinfo.insert("top", "1");
                //增加100年作为置顶时间排序最上面
                QString strTime = QDateTime::currentDateTime().addYears(100).toString("yyyy-MM-dd hh:mm:ss.zzz");
                caseinfo.insert("createtime", strTime);
                pItem->setData(strTime, QOrderRole);
                QString strSql = QString("update CaseManage set createtime= '%1' , top='1' where path='%2'").arg(strTime).arg(caseinfo.value("path").toString());
                QString strmsg = "";
                QVariantMap result;
                LocalDb::instance()->ExcuateSql(strSql, result, strmsg);
                if (m_picPathDirInfo.find(caseinfo.value("path").toString()) != m_picPathDirInfo.end())
                {
                    m_picPathDirInfo[caseinfo.value("path").toString()]["createtime"] = strTime;
                    m_picPathDirInfo[caseinfo.value("path").toString()]["top"] = "1";
                }
                pItem->setData(caseinfo, Qt::UserRole);
            }
            SlotUpdateTreeListBackground();
            m_modelTree->sort(0, Qt::DescendingOrder);
            
        }

(3)触发排序

    m_modelTree->sort(0, Qt::DescendingOrder);

插入数据之后不会自动排序,需要调用sort函数之后,才会排序,所以置顶和取消置顶,已经初始化,插入新的数据时,都要调用下sort函数,去排序;除了按照时间排序,也可以按照名称排序,或者任意角色数据进行排序;

 

posted @ 2024-09-14 17:43  一字千金  阅读(35)  评论(0编辑  收藏  举报