方法
重写QAbstractItemModel类的sort()函数。
中文排序可参考链接:https://blog.csdn.net/weixin_42887343/article/details/121560355
思路
1、QTableWidget显示表格数据,为了达到一些自定义操作,经常需要自己写数据模型类和表头类,如下代码:
m_model = new MyDataModel(this);
m_headerView = new MyHeaderView(Qt::Horizontal, ui->tblvKits);
ui->tblvKits->setModel(m_model);
ui->tblvKits->setHorizontalHeader(m_headerView);
MyDataModel类和MyHeaderView即为自定义的数据模型类和表头类。
2、而MyDataModel则是数据模型类,需要对表格数据按表头正序和逆序排序,就需要重写其继承的QStandardItemModel类中的sort函数,代码如下:
class MyDataModel: public QStandardItemModel
{
Q_OBJECT
...
void sort(int column, Qt::SortOrder order = Qt::AscendingOrder) override; //重写
};
void MyDataModel::sort(int column, Qt::SortOrder order)
{
if(Model_Check == column || Model_ID == column) //设置过滤,点击不排序的字段
return;
QStandardItemModel::sort(column, order); //排序
}
3、记得表头类中需要设置如下:
//当QHeaderView的clickableSections属性为true时,表头才能响应点击事件。
setSectionsClickable(true);
因为该属性并没有在QHeaderView的初始化中设置为true,而是在QTableView构建默认的表头时被初始化时设置为true,所以子类化QHeaderView需要显示设置,否则使用子类化的HeaderView会无法响应表头点击事件,比如点击表头排序。
最后顺便讲一讲自定义表头的方法和作用
类的定义代码如下:
class MyHeaderView : public QHeaderView
{
Q_OBJECT
public:
MyHeaderView(Qt::Orientation orientation, QWidget * parent = nullptr);
...
...
...
private:
QCheckBox *m_pHeaderChkBox;
bool m_bHasColChkBox; //是否有复选框列
};
一般主要用于添加QCheckBox全选的作用,效果如下图,其中表头字段还是在MyDataModel类中定义的。