【Qt】QT对QTableView使用QStandardItemModel模型排序


前言

网上找了很久QTableView使用QStandardItemModel模型进行排序,都是使用QSortFilterProxyModel模型进行排序,这里就不说这个方式了,因为我试了重写 bool lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const override 函数,能实现自定义排序了,但是排序号使用QStandardItemModel获取数据却还是排序之前的,后面使用自定义QStandardItem实现QStandardItemModel的自定义排序功能。


提示:以下是本篇文章正文内容,下面案例可供参考

效果展示

请添加图片描述


.h

代码如下(示例):

//自定义数字排序StandardItem
class CustomNumberStandardItem : public QStandardItem
{
public:
    virtual bool operator<(const QStandardItem &other) const {
        QCollator collator;
        collator.setNumericMode(true);
        QString curText = this->text();
        QString otherText = other.text();
        curText = curText.replace("P-", "").replace("槽位", "");
        otherText = otherText.replace("P-", "").replace("槽位", "");
        auto ret = collator.compare(curText, otherText);
        if(ret < 0)
            return true;
        else
            return false;
    }
};

//自定义节点IP排序StandardItem
class CustomNodeIpStandardItem : public QObject, public QStandardItem
{
    Q_OBJECT

public:
    CustomNodeIpStandardItem(QString strTset = QString());
    virtual bool operator<(const QStandardItem &other) const;
};



.cpp

代码如下(示例):

CustomNodeIpStandardItem::CustomNodeIpStandardItem(QString strTset)
    :QStandardItem(strTset)
{

}

bool CustomNodeIpStandardItem::operator<(const QStandardItem &other) const
{
    QString left = this->text();
    QString right = other.text();
    QStringList leftList = left.split(".");
    QStringList rightList= right.split(".");
    if(leftList.count() != 4 || rightList.count() != 4)
        return false;
    QMap<int, int> listMap;
    for (int i = 0; i < 4; i++)
        listMap.insert(i, 0);
    for (int i = 0; i < 4; i++){
        QString ipLeft = leftList.at(i);
        QString ipRihht = rightList.at(i);
        if(ipLeft.toInt() < ipRihht.toInt())
            listMap.insert(i, 1);
        else if(ipLeft.toInt() == ipRihht.toInt())
            continue;
        else
            break;
    }
    if(listMap.value(0) == 1)
       return true;
    if(listMap.value(1) == 1)
       return true;
    if(listMap.value(2) == 1)
       return true;
    if(listMap.value(3) == 1)
       return true;

    return false;
}

使用

//rowDataList为自己添加的表格一行数据
//pStandardTableModel为QStandardItemModel *pStandardTableModel;
//这里知道表格第一列和第二列为数字排序,添加时使用的CustomNumberStandardItem 
//第四列为IP列,所以使用的CustomNodeIpStandardItem 
//其他列按照字符串排序,所以没有使用自定义QStandardItem

//设置表格可以排序
your_tableView->setSortingEnabled(true);
//设置排序指示器可见![请添加图片描述](https://i-blog.csdnimg.cn/direct/60b6878476964dd6b556a14a7dadcc91.gif)

your_tableView->horizontalHeader()->setSortIndicatorShown(true);

QStringList rowDataList;
int curRow = pStandardTableModel->rowCount();
for (int i = 0; i < pStandardTableModel->columnCount(); ++i) {
	if(i == 0 || i == 1){
		CustomNumberStandardItem *numberStandardItem = new CustomNumberStandardItem;
        numberStandardItem->setText(rowDataList.at(i));
        pStandardTableModel->setItem(curRow, i, numberStandardItem);
	}
    else if(i == 4) {
		CustomNodeIpStandardItem *nodeIpStandardItem = new CustomNodeIpStandardItem;
        nodeIpStandardItem->setText(rowDataList.at(i));
        pStandardTableModel->setItem(curRow, i, nodeIpStandardItem);
	}
    else{
    	pStandardTableModel->setItem(curRow, i, new QStandardItem(rowDataList.at(i)));
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值