在 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
實現搜索功能。假設我們有一個簡單的模型,例如一個字符串列表。
#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
,我們需要手動實現搜索功能,通常是遍歷所有行,根據搜索條件顯示或隱藏行。
#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 控件實現搜索功能,但請注意,這些代碼只是簡單的示例,可能需要根據具體需求進行調整和優化。