qt create 4.11 版本下tableview 表头每列实现筛选功能 一个完整的例子
时间: 2024-05-16 17:17:01 浏览: 86
以下是一个完整的例子,演示如何在Qt Creator 4.11版本中使用TableView并为每列表头添加筛选功能。
```
#include <QApplication>
#include <QStandardItemModel>
#include <QTableView>
#include <QHeaderView>
#include <QSortFilterProxyModel>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
// Create a standard item model and populate it with data
QStandardItemModel *model = new QStandardItemModel();
model->setColumnCount(3);
model->setHeaderData(0, Qt::Horizontal, "Name");
model->setHeaderData(1, Qt::Horizontal, "Age");
model->setHeaderData(2, Qt::Horizontal, "Gender");
QList<QStandardItem *> row1 = QList<QStandardItem *>() << new QStandardItem("John") << new QStandardItem("25") << new QStandardItem("Male");
QList<QStandardItem *> row2 = QList<QStandardItem *>() << new QStandardItem("Jane") << new QStandardItem("30") << new QStandardItem("Female");
QList<QStandardItem *> row3 = QList<QStandardItem *>() << new QStandardItem("Bob") << new QStandardItem("27") << new QStandardItem("Male");
model->appendRow(row1);
model->appendRow(row2);
model->appendRow(row3);
// Create a table view and set the model
QTableView *tableView = new QTableView();
tableView->setModel(model);
// Enable sorting and filtering
tableView->setSortingEnabled(true);
tableView->setAlternatingRowColors(true);
// Create a proxy model for filtering
QSortFilterProxyModel *proxyModel = new QSortFilterProxyModel();
proxyModel->setSourceModel(model);
tableView->setModel(proxyModel);
// Set up the filter boxes for each column
QHeaderView *header = tableView->horizontalHeader();
for (int i = 0; i < header->count(); i++) {
QComboBox *comboBox = new QComboBox();
comboBox->setObjectName("filterBox");
header->setSectionWidget(i, comboBox);
// Populate the filter box with unique values from the column
QSet<QString> uniqueValues;
for (int j = 0; j < model->rowCount(); j++) {
uniqueValues.insert(model->index(j, i).data().toString());
}
foreach (QString value, uniqueValues) {
comboBox->addItem(value);
}
// Connect the signal to filter the proxy model
QObject::connect(comboBox, static_cast<void(QComboBox::*)(int)>(&QComboBox::activated), [=](int index){
proxyModel->setFilterKeyColumn(i);
proxyModel->setFilterRegExp(QRegExp(comboBox->currentText(), Qt::CaseInsensitive, QRegExp::FixedString));
});
}
tableView->show();
return app.exec();
}
```
在这个例子中,我们创建了一个包含三列数据的标准项模型,并为每列添加了表头。然后,我们使用这个模型创建了一个TableView,启用了排序和交替行颜色,并创建了一个QSortFilterProxyModel用于过滤。接下来,我们为每列表头创建了一个ComboBox,并将其添加到水平表头中。我们还从每列中提取了唯一值,并将其添加到过滤框中。最后,我们将每个ComboBox的activated信号连接到了一个lambda表达式中,该表达式设置了QSortFilterProxyModel的过滤器。
阅读全文