qt使用多线程访问sqlite数据库的完整代码
时间: 2024-09-28 07:04:23 浏览: 42
QT中sqlite多线程操作4个注意问题
3星 · 编辑精心推荐
在Qt中,使用QThread和SQLite数据库进行多线程操作是一个常见的实践,以避免UI线程受到长时间数据库查询的影响。以下是一个简单的示例,展示了如何在一个单独的线程中访问SQLite数据库:
首先,确保已包含所需的头文件:
```cpp
#include <QObject>
#include <QSqlDatabase>
#include <QThread>
```
然后创建一个处理数据库操作的类,继承自QObject,并使用QThread作为多线程基础:
```cpp
class DatabaseWorker : public QObject, public QRunnable {
Q_OBJECT
private:
QSqlDatabase db;
public:
explicit DatabaseWorker(const QString &dbPath) {
// 初始化数据库连接
if (!db.addDatabase("QSQLITE")) {
qCritical("Could not connect to SQLite database.");
return;
}
db.setHostName("");
db.setDatabaseName(dbPath);
db.setUserName("");
db.setPassword("");
if (!db.open()) {
qCritical("Failed to open database: %s", db.lastError().text().toStdString().c_str());
return;
}
}
~DatabaseWorker() {
db.close();
}
void run() override {
QSqlQuery query;
query.prepare("SELECT * FROM your_table;");
if (query.exec()) {
while (query.next()) {
// 处理查询结果
}
} else {
qCritical("Failed to execute query: %s", query.lastError().text().toStdString().c_str());
}
}
signals:
void queryFinished();
};
```
接下来,在主应用程序中创建并启动这个线程:
```cpp
DatabaseWorker* worker = new DatabaseWorker(":memory:");
QThread* thread = new QThread;
worker->moveToThread(thread);
thread->start();
// 线程运行完成后,通过信号通知主线程
connect(worker, &DatabaseWorker::queryFinished, []{
qDebug("Query finished");
});
// 发送数据库查询请求
worker->run();
```
阅读全文