Как исключить одну строку из сортировки по столбцу в QSortFilterProxyModel - PullRequest
0 голосов
/ 19 февраля 2019

Я использую QTableView с QSortFilterProxyModel.

У меня есть пустая строка для ввода вручную:

Пример таблицы

СейчасЯ хочу отсортировать по дате

Но я не хочу перемещать последнюю строку

Пример таблицы сортировки

Я будублагодарен за помощь

proxyModel->sort(2);

1 Ответ

0 голосов
/ 19 февраля 2019

Вы можете использовать пользовательский QSortFilterProxyModel, который не сортирует последнюю строку.В следующем примере вы увидите слева исходную таблицу, а справа таблицу со специальным заказом.

#include <QtWidgets>

class SortFilterProxyModel: public QSortFilterProxyModel
{
public:
    using QSortFilterProxyModel::QSortFilterProxyModel;
    bool lessThan(const QModelIndex &left,
                  const QModelIndex &right) const
    {
        int row_max = std::max(left.row(), right.row());
        if(row_max >= sourceModel()->rowCount()-1)
            return left.row() < right.row();
        return QSortFilterProxyModel::lessThan(left, right);
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QWidget w;
    QTableView *left_view = new QTableView;
    QTableView *right_view = new QTableView;
    QHBoxLayout *hlay = new QHBoxLayout(&w);
    hlay->addWidget(left_view);
    hlay->addWidget(right_view);
    QStandardItemModel model(12, 3);
    SortFilterProxyModel proxy;
    proxy.setSourceModel(&model);
    left_view->setModel(&model);
    right_view->setModel(&proxy);
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_real_distribution<> dis(100.0, 200.0);
    for (int i=0; i< model.rowCount(); ++i) {
        for(int j=0; j<model.columnCount(); ++j){
            QStandardItem *it = new QStandardItem;
            it->setData(dis(gen), Qt::DisplayRole);
            model.setItem(i, j, it);
        }
    }
    w.resize(640, 480);
    proxy.sort(2);
    w.show();
    return a.exec();
}
...