如何从QSortFilterProxyModel上的按列排序中排除一行

时间:2019-02-19 12:57:36

标签: qt sorting qsortfilterproxymodel

我正在将QTableView与QSortFilterProxyModel一起使用。

我有emty行可以手动输入:

表格示例

现在我想按日期排序

但是我不想移动最后一行

排序表示例

我将非常感谢您的帮助

proxyModel->sort(2);

1 个答案:

答案 0 :(得分:0)

您可以使用不对最后一行进行排序的自定义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();
}