基于QSqlTableModel::setFilter实现SQLite按QLineEdit输入搜索的问题
QSqlTableModel setFilter搜索功能实现方案
问题根因
你提供的示例代码核心错误是C++字符串拼接逻辑错误、SQL语法引号使用混乱:
- 代码中写的
"Název = \"' + edit + '\""是固定字符串字面量,不会自动将edit变量的用户输入值插入,最终传给数据库的过滤条件完全不符合预期 - 混用转义双引号、单引号的写法不符合SQLite的字符串语法规则,会直接触发SQL语法错误
修复后代码
快速可用版本
void MainWindow::on_pushButton_3_clicked() { QString inputName = ui->lineEdit->text().trimmed(); if (inputName.isEmpty()) { // 搜索框为空时显示全部数据,不需要筛选 model->setFilter(""); } else { // 转义输入中的单引号避免SQL语法错误,拼接合法过滤条件 QString filter = QString("Název = '%1'").arg(inputName.replace("'", "''")); model->setFilter(filter); } model->select(); }
安全优化版本(避免SQL注入风险)
手动转义单引号存在疏漏可能,推荐用Qt原生SQL接口处理输入转义:
void MainWindow::on_pushButton_3_clicked() { QString inputName = ui->lineEdit->text().trimmed(); if (inputName.isEmpty()) { model->setFilter(""); } else { QSqlField nameField("", QVariant::String); nameField.setValue(inputName); QString escapedInput = model->database().driver()->formatValue(nameField); QString filter = QString("Název = %1").arg(escapedInput); model->setFilter(filter); } model->select(); }
扩展功能(模糊搜索)
如果需要输入部分内容就能匹配,只需修改过滤条件写法即可:
// %是SQL通配符,代表任意长度的任意字符 QString filter = QString("Název LIKE '%%1%'").arg(inputName.replace("'", "''"));
常见问题排查
- 确认数据库表中的字段名和代码中的
Název拼写、大小写完全一致 - 调试时可添加
qDebug() << filter;打印最终生成的过滤语句,放到SQLite管理工具中执行,排查是语法问题还是无匹配数据 - 确认
model是已经关联了对应数据库表的QSqlTableModel实例,且之前已经调用过setTable、select方法完成初始化
内容的提问来源于stack exchange,提问作者Mach 3 Turbo
相关产品推荐
相关产品推荐

