QStandardItemModel是一个用于展示结构化数据的模型,可以通过筛选来显示部分数据。
下面是一个简单的例子,使用QStandardItemModel和QTableView来展示一组数据,并实现根据输入文本筛选显示部分数据。
- 创建QStandardItemModel对象,并设置表头数据
QStandardItemModel *model = new QStandardItemModel(this);
model->setColumnCount(3);
model->setHeaderData(0, Qt::Horizontal, "ID");
model->setHeaderData(1, Qt::Horizontal, "Name");
model->setHeaderData(2, Qt::Horizontal, "Age");
- 添加数据到模型中
QList<QStandardItem*> items;
for (int i = 0; i < data.size(); ++i) {
QList<QStandardItem*> rowItems;
for (int j = 0; j < data[i].size(); ++j) {
QStandardItem *item = new QStandardItem(data[i][j]);
rowItems.append(item);
}
model->appendRow(rowItems);
}
- 创建QTableView,并将模型设置给它
QTableView *tableView = new QTableView(this);
tableView->setModel(model);
- 创建QLineEdit,并将其与筛选槽函数连接
QLineEdit *lineEdit = new QLineEdit(this);
connect(lineEdit, &QLineEdit::textChanged, this, &MainWindow::filterData);
- 实现筛选槽函数filterData(),根据输入文本筛选数据并更新模型
void MainWindow::filterData(const QString &text)
{
QRegExp regExp(text, Qt::CaseInsensitive, QRegExp::FixedString);
QStandardItemModel *model = static_cast<QStandardItemModel*>(tableView->model());
for (int i = 0; i < model->rowCount(); ++i) {
bool match = false;
for (int j = 0; j < model->columnCount(); ++j) {
QStandardItem *item = model->item(i, j);
if (item->text().contains(regExp)) {
match = true;
break;
}
}
tableView->setRowHidden(i, !match);
}
}
在上面的代码中,我们使用QLineEdit作为筛选输入框,使用textChanged()信号来检测文本变化,并将其与filterData()槽函数连接。
在filterData()函数中,我们根据输入文本创建一个正则表达式,并逐行遍历模型中的数据,如果某一行的数据匹配了正则表达式,则将该行设置为可见,否则将该行设置为隐藏。
这样,就可以实现根据输入文本筛选部分数据的功能了。