QTableWidget点击表头排序

方法

重写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类中定义的。
在这里插入图片描述

おすすめ

転載: blog.csdn.net/weixin_42887343/article/details/121471959