• 【QT】QTableView或QTableWidget 搭配QLineEdit实现数据的搜索显示


    在 Qt 中,QTableViewQTableWidget 都可以用来实现数据的搜索和显示,但它们的适用场景和实现方式有所不同:

    QTableView

    1. 适用场景QTableView 适用于更复杂的场景,尤其是当需要处理大量数据或需要高度定制化的表格时。它是基于模型/视图(Model/View)架构的,这意味着你可以将任何实现了 QAbstractItemModel 接口的模型作为数据源

    2. 实现搜索显示

      • 你可以通过设置一个过滤器模型(例如,QSortFilterProxyModel)来实现搜索功能。
      • 过滤器模型可以放置在实际数据模型和 QTableView 之间。
      • 当用户在搜索框中输入文本时,你可以设置过滤器模型的过滤条件,这样 QTableView 就只显示匹配的行。

    QTableWidget

    1. 适用场景QTableWidgetQTableView 的一个子类,提供了一个基于项目的接口,适用于更简单的用例,如处理不大的数据集或不需要自定义模型的场景。

    2. 实现搜索显示

      • QTableWidget 没有内置的过滤支持,但可以手动实现搜索功能。
      • 实现搜索时,需要遍历所有的行和列,检查每个项目(QTableWidgetItem)是否符合搜索条件。
      • 符合条件的行可以保持可见,不符合条件的行可以通过隐藏来实现过滤效果。

    总结

    • 如果需要处理的数据量较大,或者需要高度定制化的表格(例如,不同类型的数据,复杂的渲染逻辑等),QTableView 配合自定义模型和过滤器模型是更合适的选择。
    • 如果你的需求相对简单,数据量不大,QTableWidget 通过手动过滤可能就足够了。

    在任何情况下,实现搜索功能通常涉及到监听搜索框的输入变化(例如使用 QLineEdit),然后根据输入的内容更新表格的显示。在 QTableView 的情况下,这通常意味着设置过滤器模型的过滤规则;而在 QTableWidget 的情况下,则可能需要遍历表格项并手动隐藏或显示行。

    实现

    以下是分别使用 QTableViewQTableWidget 实现简单搜索功能的示例代码。

    1. QTableView 示例

    首先,使用 QTableView 配合 QSortFilterProxyModel 实现搜索功能。假设我们有一个简单的模型,例如一个字符串列表。

    #include 
    #include 
    
    int main(int argc, char *argv[]) {
        QApplication app(argc, argv);
    
        // 创建数据模型
        QStringListModel model;
        model.setStringList(QStringList() << "Apple" << "Banana" << "Cherry" << "Date");
    
        // 创建过滤器模型并设置数据模型
        QSortFilterProxyModel proxyModel;
        proxyModel.setSourceModel(&model);
    
        // 创建视图和搜索框
        QLineEdit searchBox;
        QTableView tableView;
    
        // 设置模型
        tableView.setModel(&proxyModel);
    
        // 搜索框过滤逻辑
        QObject::connect(&searchBox, &QLineEdit::textChanged, [&](const QString &text){
            proxyModel.setFilterRegExp(QRegExp(text, Qt::CaseInsensitive, QRegExp::FixedString));
        });
    
        // 窗口布局
        QVBoxLayout *layout = new QVBoxLayout;
        layout->addWidget(&searchBox);
        layout->addWidget(&tableView);
    
        // 显示窗口
        QWidget window;
        window.setLayout(layout);
        window.show();
    
        return app.exec();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    在这个示例中,我们使用 QStringListModel 作为基础数据模型,并通过 QSortFilterProxyModel 对数据进行过滤。用户在 QLineEdit 中输入文本时,会触发过滤逻辑,更新 QTableView 中显示的数据。

    2. QTableWidget 示例

    对于 QTableWidget,我们需要手动实现搜索功能,通常是遍历所有行,根据搜索条件显示或隐藏行。

    #include 
    
    int main(int argc, char *argv[]) {
        QApplication app(argc, argv);
    
        QLineEdit searchBox;
        QTableWidget tableWidget(4, 1); // 4行1列
    
        QStringList list = QStringList() << "Apple" << "Banana" << "Cherry" << "Date";
        for (int i = 0; i < list.size(); ++i) {
            QTableWidgetItem *item = new QTableWidgetItem(list.at(i));
            tableWidget.setItem(i, 0, item);
        }
    
        QObject::connect(&searchBox, &QLineEdit::textChanged, [&](const QString &text){
            for (int i = 0; i < tableWidget.rowCount(); ++i) {
                bool match = tableWidget.item(i, 0)->text().contains(text, Qt::CaseInsensitive);
                tableWidget.setRowHidden(i, !match);
            }
        });
    
        QVBoxLayout *layout = new QVBoxLayout;
        layout->addWidget(&searchBox);
        layout->addWidget(&tableWidget);
    
        QWidget window;
        window.setLayout(layout);
        window.show();
    
        return app.exec();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    在这个例子中,使用 QTableWidget 创建了一个简单的表格,并使用 QLineEdit 作为搜索框。当用户在搜索框中输入时,我们遍历表格的每一行,根据用户的输入来决定是否隐藏该行。

    这两个例子都展示了如何结合 Qt 控件实现搜索功能,但请注意,这些代码只是简单的示例,可能需要根据具体需求进行调整和优化。

  • 相关阅读:
    类和对象:运算符重载
    JavaSE_day01【Java概述、环境搭建、标识符、变量、基本数据类型】
    学编程:Python入门考级必备[10]
    Kafka 社区KIP-405中文译文(分层存储)
    应用软件漏洞排名
    C++字符串类 - std::string - 常用总结
    论文解析——异构多芯粒神经网络加速器
    [CVE-2016-4437] Apache Shiro 安全框架反序列化漏洞复现与原理详细分析
    js中getBoundingClientRect()方法详解
    零基础入门JavaWeb——JS的文档对象模型(DOM)
  • 原文地址:https://blog.csdn.net/weixin_44939430/article/details/136395647