Qt 中基于 QTableView + QSqlTableModel 的分页搜索与数据管理实现
Qt 中基于 QTableView + QSqlTableModel 的分页搜索与数据管理实现
一、组件说明
- QTableView:一个基于模型的表格视图控件,支持排序、选择、委托自定义。
- QSqlTableModel:与数据库表直接绑定的模型类,可用于展示和编辑数据库表数据,适合与 QTableView 配合使用。
二、主要功能
1. 分页显示数据
通过 SQL 的 LIMIT
和 OFFSET
控制当前页显示的数据数量与起始位置,结合当前页码和每页条数,动态更新 QSqlTableModel:
QString limitClause = QString("LIMIT %1 OFFSET %2").arg(pageSize).arg(currentPage * pageSize);
model->setFilter(...); // 可附加 WHERE 子句
model->select();
2. 搜索过滤
使用 model->setFilter(...)
实现字段模糊查询,例如:
QString term = searchEdit->text().trimmed();
QString filter = QString("name LIKE '%%1%'").arg(term);
model->setFilter(filter);
model->select();
3. 排序功能
启用视图的排序能力,用户可点击表头排序:
view->setSortingEnabled(true);
4. 添加数据
通过 QSqlQuery
插入记录:
QSqlQuery q;
q.prepare("INSERT INTO people (name, age) VALUES (?, ?)");
q.addBindValue("New User");
q.addBindValue(30);
q.exec();
插入后刷新模型:
model->select();
5. 导出为 CSV 文件
遍历模型中的数据,保存为 .csv
文件:
QFile file("export.csv");
QTextStream out(&file);
for (int row = 0; row < model->rowCount(); ++row) {QStringList rowContent;for (int col = 0; col < model->columnCount(); ++col)rowContent << model->data(model->index(row, col)).toString();out << rowContent.join(",") << "\n";
}
三、分页控制逻辑
- 当前页:
currentPage
- 每页记录数:
pageSize
- 总记录数通过 SQL 查询统计:
QSqlQuery countQuery;
countQuery.exec("SELECT COUNT(*) FROM people WHERE ...");
int totalRows = countQuery.next() ? countQuery.value(0).toInt() : 0;
- 计算总页数:
int totalPages = (totalRows + pageSize - 1) / pageSize;
- 上一页 / 下一页按钮控制页码,并重新加载模型:
--currentPage; loadPage();
++currentPage; loadPage();
四、界面推荐布局
控件 | 用途 |
---|---|
QLineEdit | 输入搜索关键词 |
QPushButton | 搜索、分页切换等按钮 |
QLabel | 显示页码信息 |
QTableView | 显示数据表格 |
QVBoxLayout | 垂直布局整体界面 |
QHBoxLayout | 控制顶部搜索条和底部分页按钮 |
五、适用场景
- 数据管理类桌面系统
- 后台管理界面(如员工信息、客户数据、商品库存)
- 本地数据库应用的可视化工具