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. 然后声明基类的虚函数, 因为无法直接连接这个函数 我们在声明一个信号, 在这个虚函数中只有一条代码就是发出后面声明的这个信号. 然后写槽函数,具体内容根据业务. 最后连接这个信号和槽即可.