You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于QSqlTableModel::setFilter实现SQLite按QLineEdit输入搜索的问题

QSqlTableModel setFilter搜索功能实现方案

问题根因

你提供的示例代码核心错误是C++字符串拼接逻辑错误、SQL语法引号使用混乱:

  1. 代码中写的"Název = \"' + edit + '\""是固定字符串字面量,不会自动将edit变量的用户输入值插入,最终传给数据库的过滤条件完全不符合预期
  2. 混用转义双引号、单引号的写法不符合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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 13:54:02