【问题标题】:How to sort a QTableView by a column?如何按列对 QTableView 进行排序?
【发布时间】:2012-07-21 07:38:49
【问题描述】:

我正在使用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);

我做错了什么?

【问题讨论】:

    标签: c++ qt qtableview


    【解决方案1】:

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

    试试看

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

    【讨论】:

    • 谢谢!有用!但我做错了什么?为什么我的代码不起作用?我上下阅读了QTableView和QAbstractTableModel的文档,但没有找到原因。
    • 如果我理解正确的话,QTableView 只是调用了 QAbstractTableModel 的空 sort() 函数?它自己不做任何事情吗?
    • 是的。 QSqlTableModel 确实有一个排序实现 iirc,所以排序工作在那里没有代理模型。但是,当您使用自己的模型时,您需要一个 QSortFilterProxyModel,顾名思义,它也有一个排序实现。
    • QTableView 只是将排序调用转发给 model()->sort(...)
    【解决方案2】:

    对于那些希望在 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()
    

    【讨论】:

      猜你喜欢
      • 2019-04-28
      • 1970-01-01
      • 2015-04-23
      • 2017-03-11
      • 1970-01-01
      • 1970-01-01
      • 2022-01-06
      • 2016-04-08
      • 1970-01-01
      相关资源
      最近更新 更多