正常
Step 1:打开库 + 列表 + 安全关库
← 手册首页 · 下一步 Step 2 可编辑表格 →
Step 1:命名连接打开库 + sqlite_master 列表 + 关库安全释放
目标
点 Open Database… 选一个 .db 文件,左边列表里冒出这个库里所有表名;状态栏显示当前打开的文件名。再点 Close Database,列表清空、状态栏回到「No database open」,且控制台不刷 connection still in use 警告。
提示
- 开库别用默认连接:
QSqlDatabase::addDatabase("QSQLITE", connection_name)——第二参是连接名。连接名怎么定?用「文件名 + 时间戳」拼一个唯一的,同一个 db 反复打开也不撞名。 openDatabase开新库前先调closeDatabase()关掉当前库,避免两个连接同时挂着。db.open()失败要回滚:removeDatabase(connection_name)把刚 add 的连接撤掉,别留个打不开的空壳。- 列表查 SQLite 内置的
sqlite_master表:SELECT name FROM sqlite_master WHERE type='table' ORDER BY name——type='table'排除 view/index/trigger。 - 关库的释放顺序是这一步的灵魂:必须先把所有引用该连接的 model 干掉(这步还没建 model,但要预留
clearTableModel()钩子)→db.close()→QSqlDatabase::removeDatabase(name)。顺序反了就触发connection still in use。 refreshTableList里QListWidget::clear()会误触发currentRowChanged——填列表全程blockSignals(true),填完放开。- 菜单 / 工具栏放
Open(Ctrl+O)和Close(Ctrl+W/F4)两个QAction。
检查点
打开一个有几个表的 db → 左列表出现表名、状态栏显示文件名 → 关库 → 列表清空、状态栏回到初始。反复开同一库多次,控制台干净无 warning = 连接生命周期管对了。
QSqlDatabase / 命名连接机制不熟?先读 QtSql 数据库连接。 sqlite_master 是什么看 官方 schema 表文档。
对照答案
- 连接名拼接(文件名 + mtime + 自增序号):
demo/sqlite_browser_window.cpp:139-146 - openDatabase 开新库前先关、open 失败回滚:
demo/sqlite_browser_window.cpp:158-182 - 查 sqlite_master 列表 + blockSignals:
demo/sqlite_browser_window.cpp:234-261 - closeDatabase 释放顺序(model → 嵌套作用域 close → removeDatabase):
demo/sqlite_browser_window.cpp:196-219 - Open / Close QAction 装配:
demo/sqlite_browser_window.cpp:88-96
下一步:点一张表,把它的数据填进可编辑表格——Step 2 可编辑表格。