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