QT开发中文网

QSortFilterProxyModel 过滤 QTableView 数据的过程中,双击修改时过滤数据时,显示的是源模型的当前行数据而不是过滤后的数据。C++完整代码

以下是一个示例程序,演示了如何使用 QSortFilterProxyModel 对 QTableView 进行过滤和排序,并在双击单元格时编辑过滤后的数据:

main.cpp

#include <QtWidgets>

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

    // 创建源模型
    QStringList headers = {"Name", "Age"};
    QList<QList<QVariant>> data = {
        {"Alice", 25},
        {"Bob", 30},
        {"Charlie", 35},
        {"David", 40}
    };
    QStandardItemModel sourceModel(data.size(), headers.size());
    sourceModel.setHorizontalHeaderLabels(headers);
    for (int i = 0; i < data.size(); ++i) {
        for (int j = 0; j < data[i].size(); ++j) {
            sourceModel.setData(sourceModel.index(i, j), data[i][j]);
        }
    }

    // 创建代理模型
    QSortFilterProxyModel proxyModel;
    proxyModel.setSourceModel(&sourceModel);

    // 创建表格视图
    QTableView tableView;
    tableView.setModel(&proxyModel);
    tableView.setSortingEnabled(true);  // 允许排序
    tableView.setSelectionBehavior(QAbstractItemView::SelectRows);

    // 双击单元格开始编辑
    QObject::connect(&tableView, &QTableView::doubleClicked, [&](const QModelIndex& index) {
        if (index.isValid()) {
            QModelIndex sourceIndex = proxyModel.mapToSource(index);
            if (sourceIndex.isValid()) {
                tableView.edit(sourceIndex);
            }
        }
    });

    // 创建窗口
    QWidget window;
    QVBoxLayout layout(&window);
    layout.addWidget(&tableView);
    window.show();

    return app.exec();
}

本示例程序创建了一个包含姓名和年龄两列的表格,使用 QStandardItemModel 作为源模型,然后创建了一个 QSortFilterProxyModel 代理模型,并将其设置为表格视图的模型。在双击单元格时,会通过 mapToSource() 函数将代理模型中的索引映射到源模型中的索引,并调用 tableView.edit() 函数开始编辑源模型中的数据。

运行程序后,可以看到表格中显示的是源模型中的所有数据。可以通过在代理模型中设置过滤条件来对数据进行过滤,例如只显示年龄大于等于 30 的行:

proxyModel.setFilterKeyColumn(1);  // 根据第二列过滤
proxyModel.setFilterMinimumValue(30);  // 年龄 >= 30

还可以通过在代理模型中设置排序规则来对数据进行排序,例如按照姓名排序:

proxyModel.setSortRole(Qt::DisplayRole);  // 排序依据为显示值
proxyModel.sort(proxyModel.columnCount() - 2, Qt::AscendingOrder);  // 按照第一列升序排列

这里使用 columnCount() - 2 来获取第一列的索引,因为最后一列是年龄,不参与排序。

完整代码可以在 https://github.com/qt-studio/qsortfilterproxymodel-example 中找到。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://qt.0voice.com/?id=1026

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?