在 Qt 中,QTableView
和 QTableWidget
都可以用来实现数据的搜索和显示,但它们的适用场景和实现方式有所不同:
QTableView
-
适用场景 :
QTableView
适用于更复杂的场景,尤其是当需要处理大量数据或需要高度定制化的表格时。它是基于模型/视图(Model/View)架构的,这意味着你可以将任何实现了QAbstractItemModel
接口的模型作为数据源。 -
实现搜索显示:
- 你可以通过设置一个过滤器模型(例如,
QSortFilterProxyModel
)来实现搜索功能。 - 过滤器模型可以放置在实际数据模型和
QTableView
之间。 - 当用户在搜索框中输入文本时,你可以设置过滤器模型的过滤条件,这样
QTableView
就只显示匹配的行。
- 你可以通过设置一个过滤器模型(例如,
QTableWidget
-
适用场景 :
QTableWidget
是QTableView
的一个子类,提供了一个基于项目的接口,适用于更简单的用例,如处理不大的数据集或不需要自定义模型的场景。 -
实现搜索显示:
QTableWidget
没有内置的过滤支持,但可以手动实现搜索功能。- 实现搜索时,需要遍历所有的行和列,检查每个项目(
QTableWidgetItem
)是否符合搜索条件。 - 符合条件的行可以保持可见,不符合条件的行可以通过隐藏来实现过滤效果。
总结
- 如果需要处理的数据量较大,或者需要高度定制化的表格(例如,不同类型的数据,复杂的渲染逻辑等),
QTableView
配合自定义模型和过滤器模型是更合适的选择。 - 如果你的需求相对简单,数据量不大,
QTableWidget
通过手动过滤可能就足够了。
在任何情况下,实现搜索功能通常涉及到监听搜索框的输入变化(例如使用 QLineEdit
),然后根据输入的内容更新表格的显示。在 QTableView
的情况下,这通常意味着设置过滤器模型的过滤规则;而在 QTableWidget
的情况下,则可能需要遍历表格项并手动隐藏或显示行。
实现
以下是分别使用 QTableView
与 QTableWidget
实现简单搜索功能的示例代码。
1. QTableView 示例
首先,使用 QTableView
配合 QSortFilterProxyModel
实现搜索功能。假设我们有一个简单的模型,例如一个字符串列表。
cpp
#include <QtWidgets>
#include <QSortFilterProxyModel>
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();
}
在这个示例中,我们使用 QStringListModel
作为基础数据模型,并通过 QSortFilterProxyModel
对数据进行过滤。用户在 QLineEdit
中输入文本时,会触发过滤逻辑,更新 QTableView
中显示的数据。
2. QTableWidget 示例
对于 QTableWidget
,我们需要手动实现搜索功能,通常是遍历所有行,根据搜索条件显示或隐藏行。
cpp
#include <QtWidgets>
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();
}
在这个例子中,使用 QTableWidget
创建了一个简单的表格,并使用 QLineEdit
作为搜索框。当用户在搜索框中输入时,我们遍历表格的每一行,根据用户的输入来决定是否隐藏该行。
这两个例子都展示了如何结合 Qt 控件实现搜索功能,但请注意,这些代码只是简单的示例,可能需要根据具体需求进行调整和优化。