{
QVector<QPair<QTableWidgetItem*, int> > sortable;
QVector<int> unsortable;
sortable.reserve(rowCount());
unsortable.reserve(rowCount());
for (int row = 0; row < rowCount(); ++row) {
sortable.append(QPair<QTableWidgetItem*,int>(itm, row));
else
unsortable.append(row);
}
LessThan compare = (order == Qt::AscendingOrder ? &itemLessThan : &itemGreaterThan);
qStableSort(sortable.begin(), sortable.end(), compare);
emit layoutAboutToBeChanged();
QVector<QTableWidgetItem*> sorted_table(tableItems.count());
QModelIndexList from;
QModelIndexList to;
for (int i = 0; i < rowCount(); ++i) {
int r = (i < sortable.count()
? sortable.at(i).second
: unsortable.at(i - sortable.count()));
for (int c = 0; c < columnCount(); ++c) {
sorted_table[tableIndex(i, c)] = itm;
from << createIndex(r, c, 0);
to << createIndex(i, c, 0);
}
}
tableItems = sorted_table;
changePersistentIndexList(from, to); // ### slow
emit layoutChanged();
}