Qt访问数据库的坑还是挺多的。在5.13及以上版本中,QMYSQL驱动被去除了,不能直接使用。在新版本中访问MySQL还是挺麻烦的,故在此记录一下。
安装Qt时的坑
首先前往官网下载Qt:Qt下载地址
这里我选择最新的5.14.2目录下的qt-opensource-windows-x86-5.14.2.exe.
下载后双击安装,注意选择组件界面:


此处有两个注意事项:
- 必须选上Sources,里面有MySQL依赖的dll
- 要根据MySQL的位数选择对应的编译器,如64位的MySQL必须使用64位的MingW才能正常访问(网传如此,笔者未测试过32位是否使用)
别的组件根据自己的需求添加即可,安装部分就讲到这里。
配置驱动
此时我们就可以查看一下Qt中有哪些sql驱动了。
新建一个Qt Console Application项目用于测试,选择MingW-64bit作为Debugger.
在.pro文件中加入以下语句,引入sql功能:
QT += sql
main.cpp写法如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| #include <QCoreApplication> #include <QSqlDatabase> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QStringList drivers = QSqlDatabase::drivers(); foreach(QString driver, drivers) qDebug() << driver; return a.exec(); } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QStringList drivers = QSqlDatabase::drivers(); foreach(QString driver, drivers) qDebug() << driver;
return a.exec(); }
|
输出结果:
1 2 3 4 5
| "QSQLITE" "QODBC" "QODBC3" "QPSQL" "QPSQL7"
|
输出结果中并没有我们想要的QMYSQL驱动,我们需要另行配置。
添加驱动
打开\Qt5.14.2\5.14.2\Src\qtbase\src\plugins\sqldrivers\mysql目录下的mysql.pro文件启动项目,对mysql.pro作出以下修改:
1 2 3 4 5
| # QMAKE_USE += mysql # 暂时屏蔽mysql ... INCLUDEPATH += "D:\software\system\mysql-8.0.19-winx64\include" # MySQL安装路径下的include目录 LIBS += "D:\software\system\mysql-8.0.19-winx64\lib\libmysql.lib" # MySQL安装路径下的库文件 DESTDIR = ../mysql/lib/ # 输出目录
|
运行之后会报错,不要紧,找到同级目录下的lib目录,所需dll已经生成:

将生成的dll文件放入对应编译器的plugins\sqldrivers目录中,这里存放了所有sql驱动,此处我放到Qt5.14.2\5.14.2\mingw73_64\plugins\sqldrivers中:

再次运行测试程序,输出结果:
1 2 3 4 5 6 7
| "QSQLITE" "QMYSQL" "QMYSQL3" "QODBC" "QODBC3" "QPSQL" "QPSQL7"
|
我们所需的QMYSQL驱动已经存在。
添加依赖
有了驱动之后还不够,我们还需要引入mysql中的dll文件,打开mysql安装路径:mysql-8.0.19-winx64\lib,复制其中的libmysql.dll和libmysql.lib到项目编译后的目录中,本例为与项目目录同级的build-
sql_test-Desktop_Qt_5_14_2_MinGW_64_bit-Debug,这也意味着最后的打包程序中也需要手动添加这两个依赖。

访问操作
我们来试验一个简单的遍历全表:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| #include <QCoreApplication> #include <QSqlDatabase> #include <QSqlQuery> #include <QDebug>
int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); db.setHostName("localhost"); db.setPort(3306); db.setDatabaseName("hello_mysql"); db.setUserName("root"); db.setPassword("123"); if(!db.open()){ qDebug()<<"Unable to establish a database connection"; }else{ QSqlQuery query(db);
query.exec("select * from user"); while(query.next()) qDebug()<<query.value(0).toString() <<query.value("name").toString();
db.close(); }
return a.exec(); }
|
输出结果:
1 2 3 4 5 6
| "1" "雪之下雪乃" "2" "小木曾雪菜" "4" "友利奈绪" "5" "晓美焰" "6" "冬马和纱" "7" "雪之下阳乃"
|
这就是新版Qt访问MySQL的全过程。