Qt从入门到入土(十一) -数据库操作--MySQL

引言

在Qt6使用MySQL前需要先安装MySQL驱动,详情请看本篇文章Qt6配置MySQL数据库(一文全搞定)-优快云博客

安装配置好MySQL之后,就可以继续完成接下来的操作了。

MYSQL和SQLITE的区别

MYSQLSQLITE
数据存储在服务器上,通过网络与客户端通信数据存储在本地的单个磁盘文件中,无需服务器进程
需要安装服务器软件,配置较为复杂

部署简单,只需将数据库文件复制到目标位置即可 

Qt使用时需要手动编译驱动

直接使用Qt sql模块

MySQL数据库常用命令

以下是一些常用的 MySQL 命令行操作:

  • 显示所有数据库

SHOW DATABASES;

  • 选择数据库

USE database_name;

  • 显示当前数据库中的表

SHOW TABLES;

  • 创建数据库

CREATE DATABASE database_name;

  • 创建表

CREATE TABLE students(num INTEGER PRIMARY KEY,name TEXT NOT NULL,age INTEGER,sex TEXT NOT NULL);

  • 插入数据

INSERT INTO students (num,name,age,sex) VALUES (1001,"张三",18,"男");

  • 查询数据

SELECT * FROM table_name;

  • 更新数据

UPDATE table_name SET column1 = value1, column2 = value2 WHERE condition;

  • 删除数据

DELETE FROM table_name WHERE condition;

  • 删除表

DROP TABLE table_name;

  • 退出 MySQL 命令行客户端

EXIT;

导入数据库模块

在CMakeLists.txt文件中加入以下指令,其中D:/mysql-9.2.0-winx64/include需要改成自己的目录

 

find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets Sql)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets Sql)

 

include_directories("D:/mysql-9.2.0-winx64/include")
link_directories("D:/mysql-9.2.0-winx64/lib")

 

target_link_libraries(testMySQL PRIVATE Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::Sql)

 如果使用qmake编译,则在.pro文件中加入以下代码

QT += core gui sql

INCLUDEPATH += "D:/mysql-9.2.0-winx64/include"
LIBS += -L"D:/mysql-9.2.0-winx64/lib" -llibmysql  

连接数据库

    // 添加 MySQL 数据库驱动
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");

    // 设置数据库连接参数
    db.setHostName("localhost");  // 数据库服务器地址
    db.setDatabaseName("studentManagerSystem"); // 数据库名称(连接指定数据库)
    db.setPort(3306);             // 设置端口号(默认是3306)
    db.setUserName("root");       // 数据库用户名
    db.setPassword("12345678");     // 数据库密码

    // 打开数据库连接
    if (!db.open())

    {
        qDebug() << "Failed to connect to MySQL server:" << db.lastError().text();
        return -1;
    }

    qDebug()<<"Open database success!";

创建新的数据库

    // 创建一个新的数据库
    QSqlQuery query;
    if (query.exec("CREATE DATABASE studentManagerSystem"))

    {
        qDebug() << "Database 'studentManagerSystem' created successfully!";
     } 

    else

    {
        qDebug() << "Failed to create database 'studentManagerSystem':" << query.lastError().text();
     }

其他操作

MySQL和SQLite语法和基本操作类似,想了解数据库操作的可以参考此文章Qt从入门到入土(十) -数据库操作--SQLITE_qt 数据库-优快云博客

数据库操作部分代码

//打印Qt支持的数据库驱动
    qDebug() << QSqlDatabase::drivers();
    // 添加 MySQL 数据库驱动
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");

    // 设置数据库连接参数
    db.setHostName("localhost");  // 数据库服务器地址
    db.setDatabaseName("studentManagerSystem"); // 数据库名称(连接指定数据库)
    db.setPort(3306);             // 设置端口号(默认是3306)
    db.setUserName("root");       // 数据库用户名
    db.setPassword("12345678");     // 数据库密码

    // 打开数据库连接
    if (!db.open())
    {
        qDebug() << "Failed to connect to MySQL server:" << db.lastError().text();
        return -1;
    }

    qDebug()<<"Open database success!";

    QSqlQuery query(db);
    // 删除表
    if(!query.exec("DROP TABLE IF EXISTS user;"))
    {
        qDebug()<<"删除失败!"<<query.lastError();;
        return -1;
    }
    else
    {
        qDebug()<<"删除成功!";
    }
    // 创建表
    if(!query.exec("CREATE TABLE IF NOT EXISTS students(id INT PRIMARY KEY AUTO_INCREMENT,name TEXT NOT NULL,age INTEGER);"))
    {
        qDebug()<<"创建表失败"<<query.lastError();
        return -1;
    }
    else
    {
        qDebug()<<"创建表成功!";
    }
    // 插入数据
    if(!query.exec("INSERT INTO students(id,name,age) VALUES (1,'张三',18),(2,'李四',20),(3,'王五',50);"))
    {
        qDebug()<<"插入数据失败:"<<query.lastError();
        return -1;
    }
    else
    {
        qDebug()<<"插入数据成功!";
    }

    // 打印所有数据信息
    if(!query.exec("SELECT * FROM students"))
    {
        qDebug()<<"打印数据信息失败!"<<query.lastError();;
        return -1;
    }
    else
    {
        // 获取字段数量
        auto filedCount = query.record().count();

        while(query.next())
        {
            // 遍历所有字段
            for(size_t i = 0;i<filedCount;++i)
            {
                qDebug()<<query.value(i).toString();
            }
        }
    }
    db.close();

实战练习

完成一个简易的学生管理系统,主要功能包括数据库的连接和断开,以及学生数据信息增删改查。

界面设计

界面布局

qss界面样式

时间有限,仅对QPushButton进行美化

QPushButton
{
height:40px;
border-radius:10px;
background-color:rgb(27,244,255);
font-size:14px;
}
QPushButton:hover
{
background-color:rgb(23,212,222);
}

功能实现

增加数据

 

void Widget::addData()
{
    if(ui->id_edit->text().isEmpty() || ui->name_edit->text().isEmpty() ||
        ui->age_edit->text().isEmpty() || ui->sex_edit->text().isEmpty())
    {
        ui->showInfo->clear();
        ui->showInfo->append("增加数据失败!请先输入信息!");
        return;
    }
    ui->showInfo->clear();
    // trimmed函数的作用是去除首尾空格
    int num = ui->id_edit->text().trimmed().toInt();
    QString name = ui->name_edit->text().trimmed();
    int age = ui->age_edit->text().trimmed().toInt();
    QString sex = ui->sex_edit->text().trimmed();

    // 检查是否存在匹配的学生数据
    if (!query->prepare("SELECT * FROM students WHERE num = :num"))
    {
        ui->showInfo->append("查询学生数据的准备注入语句失败!");
        qDebug()<<query->lastError().text();
        return;
    }

    query->bindValue(":num", num);

    if (!query->exec())
    {
        ui->showInfo->append("查询学生数据失败!");
        qDebug()<<query->lastError().text();
        return;
    }

    if (query->next())
    {
        ui->showInfo->append("增加数据失败!该学生已存在!");
        return;
    }

    // 执行增加学生数据信息的操作
    if(!query->prepare(QString("INSERT INTO students(num,name,age,sex) VALUES('%1','%2','%3','%4')").arg(num).arg(name).arg(age).arg(sex)))
    {

        ui->showInfo->append("增加学生数据的准备注入语句失败!");
        qDebug()<<database.lastError().text();
        return;
    }
    if(!query->exec())
    {
        ui->showInfo->append("增加学生数据失败!");
        qDebug()<<database.lastError().text();
        return;
    }
    ui->showInfo->append("增加数据成功!");
    ui->showInfo->append("插入数据数量:"+QString::number(query->size()));
    ui->showInfo->append(("插入数据信息:"));
    ui->showInfo->append(QString("学号:%1").arg(num));
    ui->showInfo->append(QString("姓名:%1").arg(name));
    ui->showInfo->append(QString("年龄:%1").arg(age));
    ui->showInfo->append(QString("性别:%1").arg(sex));

}

删除数据

根据学号查询到指定数据并删除,若未找到该学生信息则删除数据失败

 

void Widget::delData()
{
    if(ui->id_edit->text().isEmpty())
    {
        ui->showInfo->clear();
        ui->showInfo->append("删除数据失败!请先输入需要删除的学生的学号!");
        return;
    }

    ui->showInfo->clear();
    int num = ui->id_edit->text().trimmed().toInt();

    // 检查是否存在匹配的学生数据
    if (!query->prepare("SELECT * FROM students WHERE num = :num"))
    {
        ui->showInfo->append("查询学生数据的准备注入语句失败!");
        qDebug()<<query->lastError().text();
        return;
    }

    query->bindValue(":num", num);

    if (!query->exec())
    {
        ui->showInfo->append("查询学生数据失败!");
        qDebug()<<query->lastError().text();
        return;
    }

    if (!query->next())
    {
        ui->showInfo->append("删除数据失败!未找到该学生!");
        return;
    }

    // 执行删除学生信息操作
    if(!query->prepare(QString("DELETE FROM students WHERE num=%1").arg(num)))
    {
        ui->showInfo->append("删除学生数据的准备注入语句失败!");
        qDebug()<<database.lastError().text();
        return;
    }
    if(!query->exec())
    {
        ui->showInfo->append("删除学生数据失败!");
        qDebug()<<database.lastError().text();
        return;
    }
    ui->showInfo->append("删除数据成功!");
}

修改数据

根据学号查询到指定数据并修改,若未找到该学生信息则修改数据失败

 

void Widget::modData()
{
    if(ui->id_edit->text().isEmpty() || ui->name_edit->text().isEmpty() ||
        ui->age_edit->text().isEmpty() || ui->sex_edit->text().isEmpty())
    {
        ui->showInfo->clear();
        ui->showInfo->append("修改数据失败!请先输入新的学生信息!学生学号不能改变!");
        return;
    }
    ui->showInfo->clear();
    // trimmed函数的作用是去除首尾空格
    int num = ui->id_edit->text().trimmed().toInt();
    QString name = ui->name_edit->text().trimmed();
    int age = ui->age_edit->text().trimmed().toInt();
    QString sex = ui->sex_edit->text().trimmed();

    // 检查是否存在匹配的学生数据
    if (!query->prepare("SELECT * FROM students WHERE num = :num"))
    {
        ui->showInfo->append("查询学生数据的准备注入语句失败!");
        qDebug()<<query->lastError().text();
        return;
    }

    query->bindValue(":num", num);

    if (!query->exec())
    {
        ui->showInfo->append("查询学生数据失败!");
        qDebug()<<query->lastError().text();
        return;
    }

    if (!query->next())
    {
        ui->showInfo->append("修改数据失败!未找到该学生!");
        return;
    }

    // 执行更新操作
    if(!query->prepare(QString("UPDATE students SET name = :name , age = :age , sex = :sex WHERE num = :num")
                            .arg(name).arg(age).arg(sex).arg(num)))
    {

        ui->showInfo->append("修改学生数据的准备注入语句失败!");
        qDebug()<<database.lastError().text();
        return;
    }
    query->bindValue(":name", name);
    query->bindValue(":age", age);
    query->bindValue(":sex", sex);
    query->bindValue(":num", num);

    if(!query->exec())
    {
        ui->showInfo->append("修改学生数据失败!");
        qDebug()<<database.lastError().text();
        return;
    }

    ui->showInfo->append("修改数据成功!");
    ui->showInfo->append(("修改后的数据信息为:"));
    ui->showInfo->append(QString("学号:%1").arg(num));
    ui->showInfo->append(QString("姓名:%1").arg(name));
    ui->showInfo->append(QString("年龄:%1").arg(age));
    ui->showInfo->append(QString("性别:%1").arg(sex));
}

查询数据

根据学号查询

 

void Widget::serData()
{
    if(ui->id_edit->text().isEmpty())
    {
        ui->showInfo->clear();
        ui->showInfo->append("查询数据失败!请先输入需要查询的学生的学号!");
        return;
    }

    ui->showInfo->clear();
    int num = ui->id_edit->text().trimmed().toInt();
    if(!query->prepare(QString("SELECT * FROM students WHERE num=%1").arg(num)))
    {
        ui->showInfo->append("查询学生数据的准备注入语句失败!");
        qDebug()<<database.lastError().text();
        return;
    }
    if(!query->exec())
    {
        ui->showInfo->append("查询数据失败!未找到该学生!");
        qDebug()<<database.lastError().text();
        return;
    }
    // 使用 query->next() 遍历查询结果
    if(query->next())
    {
        QSqlRecord rec = query->record();
        ui->showInfo->append("查询数据成功!");
        ui->showInfo->append("查询数据结果为:");
        ui->showInfo->append(QString("学号:")+QString::number(rec.value("num").toInt()));
        ui->showInfo->append(QString("姓名:")+rec.value("name").toString());
        ui->showInfo->append(QString("年龄:")+QString::number(rec.value("age").toInt()));
        ui->showInfo->append(QString("性别:")+rec.value("sex").toString());
    }
    else
    {
        ui->showInfo->append("查询数据失败!未找到该学生!");
    }
}

连接数据库

void Widget::connectDatabase()
{
    database = QSqlDatabase::addDatabase("QMYSQL");
    database.setHostName("localhost");   // 设置主机名
    database.setDatabaseName("studentManagerSystem");
    database.setPort(3306);   // 设置端口号
    database.setUserName("root");
    database.setPassword("12345678");

    if(!database.open())
    {
        ui->showInfo->append(QString("MySQL数据库打开失败!\n")+database.lastError().text());
        return;
    }
    ui->showInfo->clear();
    ui->showInfo->append("MySQL数据库连接成功!");
    // 连接数据库后可以输入信息
    ui->id_edit->setReadOnly(false);
    ui->name_edit->setReadOnly(false);
    ui->age_edit->setReadOnly(false);
    ui->sex_edit->setReadOnly(false);

    query = new QSqlQuery(database);
}

断开数据库

void Widget::disconnectDatabase()
{
    if(database.isOpen())
    {
        database.close();
        ui->showInfo->clear();
        ui->showInfo->append("MySQL数据库成功断开!");
        // 禁止输入信息
        ui->id_edit->setReadOnly(true);
        ui->name_edit->setReadOnly(true);
        ui->age_edit->setReadOnly(true);
        ui->sex_edit->setReadOnly(true);
    }
    else
    {
        ui->showInfo->clear();
        ui->showInfo->append("MySQL数据库暂未连接!");
    }
}

综合代码

main.cpp

#include "widget.h"
#include <QSqlDatabase>
#include <QApplication>
#include <QSqlQuery>
#include <QSqlError>
#include <QSqlRecord>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    Widget w;
    w.show();

    return a.exec();
}

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QSqlRecord>

QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
private:
    void initUI();
    void connectDatabase();  // 连接数据库
    void disconnectDatabase();  // 断开数据库
    void addData();    // 增加数据
    void delData();   // 删除数据
    void serData();   // 查询数据
    void modData();   // 修改数据
    void showDriver();  // 显示驱动信息
private:
    Ui::Widget *ui;
    QSqlDatabase database;
    QSqlQuery* query;
    QSqlError error;
    QSqlRecord record;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "./ui_widget.h"
#include <QFile>
#include <QStringList>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    this->setWindowTitle("学生管理系统");
    // 未连接数据库不能输入信息
    ui->id_edit->setReadOnly(true);
    ui->name_edit->setReadOnly(true);
    ui->age_edit->setReadOnly(true);
    ui->sex_edit->setReadOnly(true);

    QFile file(":/Resources/style.css");
    if(file.open(QIODevice::ReadOnly))
    {
        this->setStyleSheet(file.readAll());
    }
    initUI();
}

Widget::~Widget()
{
    delete ui;
}

void Widget::initUI()
{
    showDriver();

    // 连接数据库
    connect(ui->connect_btn,&QPushButton::clicked,this,&Widget::connectDatabase);
    // 断开数据库连接
    connect(ui->disconnect_btn,&QPushButton::clicked,this,&Widget::disconnectDatabase);
    // 增加数据
    connect(ui->add_btn,&QPushButton::clicked,this,&Widget::addData);
    // 删除数据
    connect(ui->del_btn,&QPushButton::clicked,this,&Widget::delData);
    // 修改数据
    connect(ui->modify_btn,&QPushButton::clicked,this,&Widget::modData);
    // 查询数据
    connect(ui->search_btn,&QPushButton::clicked,this,&Widget::serData);
}

void Widget::connectDatabase()
{
    database = QSqlDatabase::addDatabase("QMYSQL");
    database.setHostName("localhost");   // 设置主机名
    database.setDatabaseName("studentManagerSystem");
    database.setPort(3306);   // 设置端口号
    database.setUserName("root");
    database.setPassword("12345678");

    if(!database.open())
    {
        ui->showInfo->append(QString("MySQL数据库打开失败!\n")+database.lastError().text());
        return;
    }
    ui->showInfo->clear();
    ui->showInfo->append("MySQL数据库连接成功!");
    // 连接数据库后可以输入信息
    ui->id_edit->setReadOnly(false);
    ui->name_edit->setReadOnly(false);
    ui->age_edit->setReadOnly(false);
    ui->sex_edit->setReadOnly(false);

    query = new QSqlQuery(database);
}

void Widget::disconnectDatabase()
{
    if(database.isOpen())
    {
        database.close();
        ui->showInfo->clear();
        ui->showInfo->append("MySQL数据库成功断开!");
        // 禁止输入信息
        ui->id_edit->setReadOnly(true);
        ui->name_edit->setReadOnly(true);
        ui->age_edit->setReadOnly(true);
        ui->sex_edit->setReadOnly(true);
    }
    else
    {
        ui->showInfo->clear();
        ui->showInfo->append("MySQL数据库暂未连接!");
    }
}

void Widget::addData()
{
    if(ui->id_edit->text().isEmpty() || ui->name_edit->text().isEmpty() ||
        ui->age_edit->text().isEmpty() || ui->sex_edit->text().isEmpty())
    {
        ui->showInfo->clear();
        ui->showInfo->append("增加数据失败!请先输入信息!");
        return;
    }
    ui->showInfo->clear();
    // trimmed函数的作用是去除首尾空格
    int num = ui->id_edit->text().trimmed().toInt();
    QString name = ui->name_edit->text().trimmed();
    int age = ui->age_edit->text().trimmed().toInt();
    QString sex = ui->sex_edit->text().trimmed();

    // 检查是否存在匹配的学生数据
    if (!query->prepare("SELECT * FROM students WHERE num = :num"))
    {
        ui->showInfo->append("查询学生数据的准备注入语句失败!");
        qDebug()<<query->lastError().text();
        return;
    }

    query->bindValue(":num", num);

    if (!query->exec())
    {
        ui->showInfo->append("查询学生数据失败!");
        qDebug()<<query->lastError().text();
        return;
    }

    if (query->next())
    {
        ui->showInfo->append("增加数据失败!该学生已存在!");
        return;
    }

    // 执行增加学生数据信息的操作
    if(!query->prepare(QString("INSERT INTO students(num,name,age,sex) VALUES('%1','%2','%3','%4')").arg(num).arg(name).arg(age).arg(sex)))
    {

        ui->showInfo->append("增加学生数据的准备注入语句失败!");
        qDebug()<<database.lastError().text();
        return;
    }
    if(!query->exec())
    {
        ui->showInfo->append("增加学生数据失败!");
        qDebug()<<database.lastError().text();
        return;
    }
    ui->showInfo->append("增加数据成功!");
    ui->showInfo->append("插入数据数量:"+QString::number(query->size()));
    ui->showInfo->append(("插入数据信息:"));
    ui->showInfo->append(QString("学号:%1").arg(num));
    ui->showInfo->append(QString("姓名:%1").arg(name));
    ui->showInfo->append(QString("年龄:%1").arg(age));
    ui->showInfo->append(QString("性别:%1").arg(sex));

}

void Widget::delData()
{
    if(ui->id_edit->text().isEmpty())
    {
        ui->showInfo->clear();
        ui->showInfo->append("删除数据失败!请先输入需要删除的学生的学号!");
        return;
    }

    ui->showInfo->clear();
    int num = ui->id_edit->text().trimmed().toInt();

    // 检查是否存在匹配的学生数据
    if (!query->prepare("SELECT * FROM students WHERE num = :num"))
    {
        ui->showInfo->append("查询学生数据的准备注入语句失败!");
        qDebug()<<query->lastError().text();
        return;
    }

    query->bindValue(":num", num);

    if (!query->exec())
    {
        ui->showInfo->append("查询学生数据失败!");
        qDebug()<<query->lastError().text();
        return;
    }

    if (!query->next())
    {
        ui->showInfo->append("删除数据失败!未找到该学生!");
        return;
    }

    // 执行删除学生信息操作
    if(!query->prepare(QString("DELETE FROM students WHERE num=%1").arg(num)))
    {
        ui->showInfo->append("删除学生数据的准备注入语句失败!");
        qDebug()<<database.lastError().text();
        return;
    }
    if(!query->exec())
    {
        ui->showInfo->append("删除学生数据失败!");
        qDebug()<<database.lastError().text();
        return;
    }
    ui->showInfo->append("删除数据成功!");
}

void Widget::serData()
{
    if(ui->id_edit->text().isEmpty())
    {
        ui->showInfo->clear();
        ui->showInfo->append("查询数据失败!请先输入需要查询的学生的学号!");
        return;
    }

    ui->showInfo->clear();
    int num = ui->id_edit->text().trimmed().toInt();
    if(!query->prepare(QString("SELECT * FROM students WHERE num=%1").arg(num)))
    {
        ui->showInfo->append("查询学生数据的准备注入语句失败!");
        qDebug()<<database.lastError().text();
        return;
    }
    if(!query->exec())
    {
        ui->showInfo->append("查询数据失败!未找到该学生!");
        qDebug()<<database.lastError().text();
        return;
    }
    // 使用 query->next() 遍历查询结果
    if(query->next())
    {
        QSqlRecord rec = query->record();
        ui->showInfo->append("查询数据成功!");
        ui->showInfo->append("查询数据结果为:");
        ui->showInfo->append(QString("学号:")+QString::number(rec.value("num").toInt()));
        ui->showInfo->append(QString("姓名:")+rec.value("name").toString());
        ui->showInfo->append(QString("年龄:")+QString::number(rec.value("age").toInt()));
        ui->showInfo->append(QString("性别:")+rec.value("sex").toString());
    }
    else
    {
        ui->showInfo->append("查询数据失败!未找到该学生!");
    }
}

void Widget::modData()
{
    if(ui->id_edit->text().isEmpty() || ui->name_edit->text().isEmpty() ||
        ui->age_edit->text().isEmpty() || ui->sex_edit->text().isEmpty())
    {
        ui->showInfo->clear();
        ui->showInfo->append("修改数据失败!请先输入新的学生信息!学生学号不能改变!");
        return;
    }
    ui->showInfo->clear();
    // trimmed函数的作用是去除首尾空格
    int num = ui->id_edit->text().trimmed().toInt();
    QString name = ui->name_edit->text().trimmed();
    int age = ui->age_edit->text().trimmed().toInt();
    QString sex = ui->sex_edit->text().trimmed();

    // 检查是否存在匹配的学生数据
    if (!query->prepare("SELECT * FROM students WHERE num = :num"))
    {
        ui->showInfo->append("查询学生数据的准备注入语句失败!");
        qDebug()<<query->lastError().text();
        return;
    }

    query->bindValue(":num", num);

    if (!query->exec())
    {
        ui->showInfo->append("查询学生数据失败!");
        qDebug()<<query->lastError().text();
        return;
    }

    if (!query->next())
    {
        ui->showInfo->append("修改数据失败!未找到该学生!");
        return;
    }

    // 执行更新操作
    if(!query->prepare(QString("UPDATE students SET name = :name , age = :age , sex = :sex WHERE num = :num")
                            .arg(name).arg(age).arg(sex).arg(num)))
    {

        ui->showInfo->append("修改学生数据的准备注入语句失败!");
        qDebug()<<database.lastError().text();
        return;
    }
    query->bindValue(":name", name);
    query->bindValue(":age", age);
    query->bindValue(":sex", sex);
    query->bindValue(":num", num);

    if(!query->exec())
    {
        ui->showInfo->append("修改学生数据失败!");
        qDebug()<<database.lastError().text();
        return;
    }

    ui->showInfo->append("修改数据成功!");
    ui->showInfo->append(("修改后的数据信息为:"));
    ui->showInfo->append(QString("学号:%1").arg(num));
    ui->showInfo->append(QString("姓名:%1").arg(name));
    ui->showInfo->append(QString("年龄:%1").arg(age));
    ui->showInfo->append(QString("性别:%1").arg(sex));
}

void Widget::showDriver()
{
    auto list = database.drivers();
    // 显示驱动信息
    ui->showInfo->append("当前Qt支持的驱动有:");
    for(size_t i = 0;i<list.length();++i)
    {
        ui->showInfo->append(list[i]);
    }
}

 

03-11
<think>好的,我现在需要帮助用户解决如何在Qt中使用MySQL或者寻找相关的集成资源。首先,我得回想一下Qt数据库模块相关知识。记得Qt提供了一个统一的数据库接口,叫做Qt SQL模块,支持多种数据库,包括MySQL。用户可能需要知道如何配置和连接MySQL数据库。 首先,用户需要安装MySQL的驱动程序。Qt默认可能没有包含MySQL的驱动,需要自己编译。这里可能需要指导用户如何编译QMYSQL插件。需要检查Qt的安装目录下是否有相应的源文件,比如sqldrivers文件夹里的mysql项目。编译时可能需要MySQL的客户端库,比如libmysql.dll或者.so文件,用户需要确保这些库的路径正确,并且在编译时链接进去。如果用户使用的是预编译的Qt版本,可能需要从源码重新编译SQL插件,这可能会比较复杂,特别是对于新手来说。所以需要详细说明步骤,或者建议用户查阅官方文档。 接下来,用户需要在项目中启用SQL模块。在.pro文件中添加QT += sql,这样才能使用Qt数据库类。然后,在代码中,用户需要包含相应的头文件,比如QSqlDatabase、QSqlQuery等。创建数据库连接时,使用QSqlDatabase::addDatabase("QMYSQL")来指定使用MySQL驱动。然后设置主机名、数据库名、用户名、密码等参数,调用open()方法连接数据库。 如果连接失败,可能需要检查错误信息,比如调用lastError()方法。常见的问题可能包括驱动未加载,这时候需要确认QMYSQL插件是否编译正确,并且放在了Qt的插件目录下。另外,MySQL服务器是否运行,用户权限是否正确,以及网络连接是否通畅也是常见问题。 用户可能还需要执行SQL查询,比如使用QSqlQuery来执行SELECT、INSERT等操作。这里需要示范如何执行查询并处理结果,比如遍历结果集。同时,事务处理也是重要的一环,可能需要说明如何使用transaction()和commit()方法。 另外,根据用户提供的引用,引用[1]提到使用Q_INVOKABLE或Qt槽,并连接Qt信号。可能在数据库操作中,用户希望将某些操作封装成可调用的方法,或者通过信号槽机制来异步处理数据库操作。例如,在数据加载完成后发射一个信号,更新UI。这部分可能需要结合Qt的元对象系统,确保数据库操作不会阻塞主线程,尤其是在图形界面应用中。 引用[2]讨论的是Bao的学习方法,可能和数据库查询优化有关,但用户的问题主要集中在QtMySQL的集成,所以暂时可以不深入这部分,除非用户有进一步的需求。引用[3]是一个转载的链接,可能包含一些中文资源,需要检查链接是否有效,但考虑到链接是2007年的,可能已经失效,所以建议用户查找更新的资源或者官方文档。 用户可能需要相关的示例代码,比如如何建立连接、执行查询、处理结果。同时,可能还需要指导如何处理常见的错误,比如驱动加载失败、连接超时等。此外,资源推荐方面,Qt官方文档应该是首选,还有可靠的教程网站或者书籍,比如《C++ GUI Programming with Qt 4》或者Qt的官方示例项目。 最后,要确保回答结构清晰,分步骤说明,并给出验证连接是否成功的方法,以及常见问题的解决办法。可能还需要提醒用户注意MySQL的版本兼容性,以及Qt版本对应的MySQL驱动要求,比如某些Qt版本可能只支持特定版本的MySQL客户端库。</think>### 如何在Qt中使用MySQL 以下是QtMySQL集成的分步指南: --- #### 1. **安装MySQL驱动(关键步骤)** - Qt默认未包含MySQL驱动,需手动编译: ```bash # 进入QtMySQL驱动源码目录(路径根据实际安装位置调整) cd /path/to/Qt/Src/qtbase/src/plugins/sqldrivers/mysql # 使用qmake生成Makefile(需指定MySQL头文件和库路径) qmake -- MYSQL_INCDIR=/usr/include/mysql MYSQL_LIBDIR=/usr/lib/x86_64-linux-gnu make make install ``` - **验证驱动**: ```cpp #include <QSqlDatabase> qDebug() << QSqlDatabase::drivers(); // 输出应包含"QMYSQL" ``` 若未找到`QMYSQL`,检查插件路径是否正确(如`plugins/sqldrivers`)[^1]。 --- #### 2. **配置Qt项目** - 在`.pro`文件中添加SQL模块: ```makefile QT += sql ``` --- #### 3. **连接MySQL数据库** ```cpp #include <QSqlDatabase> #include <QSqlError> QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); db.setHostName("localhost"); // 主机名 db.setDatabaseName("test_db"); // 数据库名 db.setUserName("root"); // 用户名 db.setPassword("123456"); // 密码 if (!db.open()) { qDebug() << "连接失败:" << db.lastError().text(); } else { qDebug() << "连接成功!"; } ``` --- #### 4. **执行SQL查询** ```cpp QSqlQuery query; query.exec("CREATE TABLE IF NOT EXISTS users (id INT PRIMARY KEY, name VARCHAR(20))"); query.exec("INSERT INTO users VALUES (1, 'QtUser')"); // 查询数据 query.exec("SELECT * FROM users"); while (query.next()) { int id = query.value(0).toInt(); QString name = query.value(1).toString(); qDebug() << "ID:" << id << "Name:" << name; } ``` --- #### 5. **错误处理与调试** - **常见错误**: - `QSqlDatabase: QMYSQL driver not loaded`:驱动未正确编译或放置。 - `Access denied for user`:检查MySQL用户权限。 - `Can't connect to MySQL server`:确认MySQL服务是否运行(`sudo service mysql status`)。 --- ### 相关资源推荐 1. **官方文档**: - [Qt SQL Module](https://doc.qt.io/qt-6/qtsql-index.html) - [MySQL Driver Build Guide](https://doc.qt.io/qt-6/sql-driver.html#mysql) 2. **书籍**: -C++ GUI Qt 4编程(第二版)》第13章数据库编程。 3. **社区教程**: - [Qt中文网数据库专题](http://www.qter.org/?cat=20) [^3] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值