Qt 数据库操作 #

数据库模块概述 #

text
┌─────────────────────────────────────────────────────────────┐
│                    Qt SQL 模块                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  数据库连接:                                                │
│  └── QSqlDatabase    - 数据库连接管理                       │
│                                                             │
│  数据库操作:                                                │
│  ├── QSqlQuery       - 执行 SQL 语句                        │
│  ├── QSqlTableModel  - 表格模型(可编辑)                   │
│  └── QSqlRelationalTableModel - 关系表格模型                │
│                                                             │
│  其他:                                                     │
│  ├── QSqlError       - 错误信息                             │
│  ├── QSqlRecord      - 记录结构                             │
│  └── QSqlField       - 字段信息                             │
│                                                             │
│  支持的数据库:                                              │
│  SQLite, MySQL, PostgreSQL, ODBC, Oracle 等                 │
│                                                             │
└─────────────────────────────────────────────────────────────┘

数据库连接 #

SQLite 连接 #

cpp
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>

bool connectSQLite(const QString &dbPath)
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName(dbPath);
    
    if (!db.open()) {
        qDebug() << "Failed to open database:" << db.lastError().text();
        return false;
    }
    
    qDebug() << "Database connected successfully";
    return true;
}

MySQL 连接 #

cpp
bool connectMySQL(const QString &host, const QString &dbName,
                  const QString &user, const QString &password)
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName(host);
    db.setDatabaseName(dbName);
    db.setUserName(user);
    db.setPassword(password);
    db.setPort(3306);
    
    if (!db.open()) {
        qDebug() << "Failed to connect:" << db.lastError().text();
        return false;
    }
    
    return true;
}

多数据库连接 #

cpp
// 添加命名连接
QSqlDatabase db1 = QSqlDatabase::addDatabase("QSQLITE", "connection1");
db1.setDatabaseName("db1.sqlite");
db1.open();

QSqlDatabase db2 = QSqlDatabase::addDatabase("QSQLITE", "connection2");
db2.setDatabaseName("db2.sqlite");
db2.open();

// 获取连接
QSqlDatabase conn1 = QSqlDatabase::database("connection1");
QSqlDatabase conn2 = QSqlDatabase::database("connection2");

// 移除连接
QSqlDatabase::removeDatabase("connection1");

SQL 操作 #

创建表 #

cpp
bool createTable()
{
    QSqlQuery query;
    QString sql = R"(
        CREATE TABLE IF NOT EXISTS users (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            name TEXT NOT NULL,
            email TEXT UNIQUE,
            age INTEGER,
            created_at DATETIME DEFAULT CURRENT_TIMESTAMP
        )
    )";
    
    if (!query.exec(sql)) {
        qDebug() << "Create table failed:" << query.lastError().text();
        return false;
    }
    
    return true;
}

插入数据 #

cpp
// 方式一:直接执行
bool insertUser(const QString &name, const QString &email, int age)
{
    QSqlQuery query;
    query.prepare("INSERT INTO users (name, email, age) VALUES (?, ?, ?)");
    query.addBindValue(name);
    query.addBindValue(email);
    query.addBindValue(age);
    
    if (!query.exec()) {
        qDebug() << "Insert failed:" << query.lastError().text();
        return false;
    }
    
    return true;
}

// 方式二:命名占位符
bool insertUserNamed(const QString &name, const QString &email, int age)
{
    QSqlQuery query;
    query.prepare("INSERT INTO users (name, email, age) VALUES (:name, :email, :age)");
    query.bindValue(":name", name);
    query.bindValue(":email", email);
    query.bindValue(":age", age);
    
    return query.exec();
}

// 获取插入的 ID
qint64 getLastInsertId()
{
    QSqlQuery query;
    query.exec("SELECT last_insert_rowid()");
    if (query.next()) {
        return query.value(0).toLongLong();
    }
    return -1;
}

查询数据 #

cpp
// 查询所有
void queryAllUsers()
{
    QSqlQuery query("SELECT id, name, email, age FROM users");
    
    while (query.next()) {
        int id = query.value(0).toInt();
        QString name = query.value(1).toString();
        QString email = query.value(2).toString();
        int age = query.value(3).toInt();
        
        qDebug() << id << name << email << age;
    }
}

// 条件查询
void queryUsersByAge(int minAge)
{
    QSqlQuery query;
    query.prepare("SELECT * FROM users WHERE age >= ?");
    query.addBindValue(minAge);
    
    if (query.exec()) {
        while (query.next()) {
            qDebug() << query.value("name").toString()
                     << query.value("age").toInt();
        }
    }
}

// 按字段名获取值
void queryWithFieldNames()
{
    QSqlQuery query("SELECT * FROM users");
    QSqlRecord record = query.record();
    
    while (query.next()) {
        for (int i = 0; i < record.count(); ++i) {
            QString fieldName = record.fieldName(i);
            QVariant value = query.value(i);
            qDebug() << fieldName << ":" << value;
        }
    }
}

更新数据 #

cpp
bool updateUserAge(int id, int newAge)
{
    QSqlQuery query;
    query.prepare("UPDATE users SET age = ? WHERE id = ?");
    query.addBindValue(newAge);
    query.addBindValue(id);
    
    if (!query.exec()) {
        qDebug() << "Update failed:" << query.lastError().text();
        return false;
    }
    
    int rowsAffected = query.numRowsAffected();
    return rowsAffected > 0;
}

删除数据 #

cpp
bool deleteUser(int id)
{
    QSqlQuery query;
    query.prepare("DELETE FROM users WHERE id = ?");
    query.addBindValue(id);
    
    return query.exec();
}

事务处理 #

cpp
bool transferData()
{
    QSqlDatabase db = QSqlDatabase::database();
    
    if (!db.transaction()) {
        return false;
    }
    
    QSqlQuery query;
    
    try {
        query.exec("INSERT INTO table1 VALUES (...)");
        query.exec("UPDATE table2 SET ...");
        query.exec("DELETE FROM table3 WHERE ...");
        
        db.commit();
        return true;
    } catch (...) {
        db.rollback();
        return false;
    }
}

QSqlTableModel #

基本使用 #

cpp
#include <QSqlTableModel>
#include <QTableView>

QSqlTableModel *model = new QSqlTableModel(this);
model->setTable("users");
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->select();

// 设置表头
model->setHeaderData(0, Qt::Horizontal, "ID");
model->setHeaderData(1, Qt::Horizontal, "Name");
model->setHeaderData(2, Qt::Horizontal, "Email");

// 显示在表格视图
QTableView *view = new QTableView;
view->setModel(model);

// 添加行
model->insertRow(0);
model->setData(model->index(0, 1), "New User");
model->setData(model->index(0, 2), "new@email.com");
model->submitAll();  // 提交更改

// 删除行
model->removeRow(0);
model->submitAll();

// 过滤
model->setFilter("age > 20");
model->select();

// 排序
model->setSort(1, Qt::AscendingOrder);
model->select();

下一步 #

现在你已经掌握了数据库操作,接下来学习 多媒体,了解 Qt 的音视频处理能力!

最后更新:2026-03-29