【Qt一骚操作】QTableView sort 排序手段、屏蔽排序

QTabelView sort

在QT中为了通过表格展示数据时,通常采用QTableView组件来展示。
常用的表格储存方式就是通过QStandardItemModel来进行存储

(1) 排序

Qt 中排序通常如果通过某列进行排序,用到sortByColumn

或者对模型model使用sort进行排序 该两种方式。

代码示例如下:

self.model=QStandardItemModel()
self.tableView.setModel(self.model)
...
self.model.setItem(0,0,QStandardItem(item.text()))#通过改变model中的值来改变QTableWidget中展示的表格,此处为00

而如果要对表格的某列按照**降序(或升序)**排列时,代码如下:

self.tableView.sortByColumn(0,Qt.DescendingOrder) 
或
self.model.sort(0,Qt.DescendingOrder)  #升序Qt.AscendingOrder 

注意:sortByColumn()函数最后调用的model的sort函数。

即无论对model还是对tableview进行排序均能得到效果。

QSqlQueryModel和QAbstractTableModel这两个类本身是没有sort函数的,只能使用QAbstractItemModel类的sort函数。

QAbstractItemModel类中的sort函数形式如下:

virtual void sort(int column, Qt::SortOrder order = Qt::AscendingOrder)

它是一个虚拟函数,也就是说没有具体的实现,是无法真正用于排序的。

(2)setData 设值

如果像之前该作者遇到的这样的问题,即是遇到以下情况。需要通过setData函数来进行设值处理。

但是对数值进行排序是则会产生问题,例如:

某列数值{1,2,3...,99}进行降序排序,排序结果则为
{99,98,97......91,90,9,89....,11,10,1}

其根本原因在于setItem函数输入的数据只能是字符串类型,因此在排序时将会把数值当做字符串进行排序

如何在输入函数值时保留原始数据的属性从而使得排序正常呢?
可以使用setData函数

item =QStandardItem()
item.setData(number_data,Qt.DisplayRole) #将number_data替换为数值即可
self.model.setItem(0,0,item)

(3)屏蔽排序/表头排序图标

setSortingEnabled(false)  // 排序禁用

setSortIndicatorShown(false); // 表头排序器 禁用

(4)默认不显示排序图标,点击表头显示排序图标,进行排序

 	// 不设置排序
    m_tableView->setSortingEnabled(false);
    // 隐藏排序图标
    m_tableView->horizontalHeader()->setSortIndicatorShown(false);
	// 信号发出,进行排序以及图标显示
    connect(m_tableView->horizontalHeader(), &QHeaderView::sortIndicatorChanged, this, [this](int logicalIndex, Qt::SortOrder order) {
        qDebug() << logicalIndex << order;
        if (0 == logicalIndex) {
            this->m_model->sort(0, order);
            m_tableView->horizontalHeader()->setSortIndicatorShown(true);
        }
    });

相关参考:

QTableWidget 设置表头排序
QT QTableWidget 只有某一列(某几列)可以点击排序,可显示箭头
Qt 之界面数据存储与获取
QTableView,QStandardItemModel中对数据进行排序(pyqt5,python)
QT中QTableView 点击表头进行排序
QT中Qtableview视图表格中点击表头进行排序
QTableView自定义Model实现排序

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Monster_H777

我直说吧:你的奖励我的动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值