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函数,去排序;除了按照时间排序,也可以按照名称排序,或者任意角色数据进行排序;
自己开发了一个股票智能分析软件,功能很强大,需要的关注微信公众号:QStockView