QTableView 设置点击表头排序

1.  tableView->setSortingEnabled(true); 设置启用表排序

2. 在继承自QAbstractTableModel的类中声明这个基类的虚函数void sort(int column, Qt::SortOrder order); 因为这是一个虚函数Connect无法连接它, 所以我们还需要在下面在声明一个函数void sortTriggered(int column, Qt::SortOrder order);  用它来代替发出信号,  因为是信号,所以都没有实现,代码就不粘帖了.

3. 声明槽函数void sortComponents(int column, Qt::SortOrder order);

槽函数具体实现:

qSort(list.begin(), list.end(), [=](const Device& c1, const Device& c2)->bool{

        Device cc1 = c1;

        Device cc2 = c2;

        if(order == Qt::AscendingOrder)

            return DeviceTableModel::dataAtColumn(column, &cc1) <

                  DeviceTableModel::dataAtColumn(column, &cc2);

        else

            return DeviceTableModel::dataAtColumn(column, &cc1) >

                  DeviceTableModel::dataAtColumn(column, &cc2);

    });

函数 QVariant DeviceTableModel::dataAtColumn(int col, Device* c) 的实现

QVariant DeviceTableModel::dataAtColumn(int col, Device* c)

{

    switch (col)

    {

//    case  0: return c->id; 

    case  0: return c->name; 

    case  1: return c->region; 

    case  2: return c->number;  

    case  3: return c->device; 

    case  4: return c->creatDate;  

    case  5: return c->newmodifyDate; 

    case  6: return c->useDate; 

    default:

        break;

    }

    return QVariant();

}

槽函数我根据业务拆分了两个方法, 嫌麻烦也可以直接写一个方法里.

4. 最后 connect(d->tableModel, &DeviceTableModel::sortTriggered, this, &DeviceView::sortComponents);

qSort函数帮助我们实现很多细节, 不管是字符串还是数字都会自己排序, 所以比对数字大小这些细节就不用做了.


大概流程就是 

先启用QTableView的表排序 设置为True. 然后声明基类的虚函数, 因为无法直接连接这个函数 我们在声明一个信号, 在这个虚函数中只有一条代码就是发出后面声明的这个信号. 然后写槽函数,具体内容根据业务. 最后连接这个信号和槽即可.

你可能感兴趣的:(QTableView 设置点击表头排序)