如何通过列对QTableView进行排序?

20

我正在使用 QTableView 显示一个 QAbstractTableModel:

#include <QtGui/QApplication>
#include <QAbstractTableModel>
#include <QTableView>

class TestModel : public QAbstractTableModel
{
public:
    int rowCount(const QModelIndex &parent = QModelIndex()) const
    {
        return 2;
    }
    int columnCount(const QModelIndex &parent = QModelIndex()) const
    {
        return 2;
    }
    QVariant data(const QModelIndex &index, int role) const
    {
        switch (role)
        {
        case Qt::DisplayRole:
        {
            return 4 - index.row() + index.column();
        }
        }
        return QVariant();
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QTableView table;
    TestModel model;
    table.setModel(&model);
    table.setSortingEnabled(true);
    table.sortByColumn(0, Qt::AscendingOrder);
    table.reset();
    table.show();

    return a.exec();
}

展示的小部件

问题是,当我使用以下代码时,结果完全相同:

table.sortByColumn(0, Qt::AscendingOrder);
或者
table.sortByColumn(0, Qt::DescendingOrder);
或者
table.sortByColumn(1, Qt::AscendingOrder);
或者
table.sortByColumn(1, Qt::DescendingOrder);

我做错了什么?


对我来说,它按照你所描述的方式运行良好。 - Gustavo Grisales
2个回答

27

QAbstractTableModel提供了一个空的sort()实现。

尝试执行

TestModel model;
QSortFilterProxyModel proxyModel;
proxyModel.setSourceModel( &model );
table.setModel( &proxyModel ); 

谢谢!它起作用了!但是我做错了什么?为什么我的代码不起作用?我已经反复阅读了QTableView和QAbstractTableModel的文档,但没有找到原因。 - Martin Drozdik
如果我理解正确的话,QTableView只是调用了QAbstractTableModel的空sort()函数?它本身不进行任何排序吗? - Martin Drozdik
1
是的,没错。如果我没记错的话,QSqlTableModel确实有一个排序实现,因此在那里进行排序时不需要代理模型。但是,由于您正在使用自己的模型,因此您需要一个QSortFilterProxyModel,它 - 如其名称所示 - 也具有排序实现。 - Tim Meyer
QTableView只是将排序调用转发给model()->sort(...)。 - Tim Meyer

5
对于想要在Python中实现此操作的人,这适用于PySide6。
import sys
from PySide6.QtCore import QAbstractTableModel, Qt, QSortFilterProxyModel
from PySide6.QtWidgets import QTableView, QApplication

class TestModel(QAbstractTableModel):

    def __init__(self):
        super().__init__()

    def rowCount(self, index):
        return 2

    def columnCount(self, index):
        return 2

    def data(self, index, role):
        if role == Qt.DisplayRole:
            return 4 - index.row() + index.column()


def main():
    a = QApplication(sys.argv)

    table = QTableView()
    model = TestModel()
    proxyModel = QSortFilterProxyModel()
    proxyModel.setSourceModel(model)
    table.setModel(proxyModel)
    table.setSortingEnabled(True)
    table.sortByColumn(0, Qt.AscendingOrder)
    table.reset()
    table.show()

    sys.exit(a.exec())


if __name__ == "__main__":
    main()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接