经过鄙人百度,好像从QT 5.7开始,默认没有mysql驱动,都是要自己手动编译了,所以需要我们在QT官网下载源码,自己生成驱动文件在放入QT的数据库文件夹中
QT无mysql驱动
今天想使用QT程序连接一下mysql数据库,却报错:
QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QODBC QODBC3 QPSQL QPSQL7
环境
- Deepin 20
- QT 5.15
- Qt Creator
- qmake
下载QT源文件
这是目前有效的链接:QT 5.15.1 EveryWhere Src
下载并解压缩,如下图所示:
确定qmake
找到自己qmake的位置
kang@kang-PC:~$ whereis qmake
qmake: /usr/bin/qmake
查看qmake版本:
kang@kang-PC:~/Downloads/qt-everywhere-src-5.15.1/qt-everywhere-src-5.15.1/qtbase/src/plugins/sqldrivers/mysql$ /usr/bin/qmake -v
qmake: could not exec '/usr/lib/x86_64-linux-gnu/qt4/bin/qmake': No such file or directory
我这里好像是qmake位置不正确,于是我直接加路径运行qmake(当然,你也可以修改一下usr/bin的qmake或像我一样图省事):
~/Downloads/qt-everywhere-src-5.15.1/qt-everywhere-src-5.15.1/qtbase/src/plugins/sqldrivers/mysql$ ~/Software/Qt/5.15.0/gcc_64/bin/qmake -v
QMake version 3.1
Using Qt version 5.15.0 in /home/kang/Software/Qt/5.15.0/gcc_64/lib
编译mysql驱动
解压缩之后,我们进入到mysql驱动项目的目录下:~/Downloads/qt-everywhere-src-5.15.1/qt-everywhere-src-5.15.1/qtbase/src/plugins/sqldrivers/mysql
这个要根据你自己的解压位置确定
修改mysql.pro:
vim mysql.pro
修改完成如下图所示:
- 第一块红色的
include
可以像我一样填写 - 第二块红色的
QMAKE_USE
需要注释掉 - 第三块红色的
INCLUDEPATH
和DEPENDPATH
需要根据你的实际情况填写
我是因为apt搜不到mysql,所以安装了
mariadb的dev
包sudo apt-get install libmariadb-dev
如果执行qmake命令过程中遇见错误
Cannot read qtsqldrivers-config.pri: No such file or directory
我们需在mysql.pro
找到qsqldriverbase.pri
的位置
我这里很明显告诉我qsqldriverbase.pri
文件在上一级目录,接下来打开qsqldriverbase.pri
文件,内容如下图:
我们只需要注释上图红色选中部分即可
保存并执行qmake命令:
qmake "LIBS+=-L/usr/lib -lmysqlclient_r" mysql.pro
命令执行完后,我们会在目录下看到一个Makefile文件,执行sudo make
当执行完命令后,我们可以在控制台打印信息中看到生成的驱动文件位置:
此时,我们将编译好的so文件复制到QT目录下的对应位置即可,一般都是{QT install path}/{版本}/gcc_64/plugins/sqldrivers
测试
修改pro文件
修改项目pro文件Hello.pro
,在QT +=
后面追加sql
测试数据库连接
添加数据库连接代码:
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("ptdb.dakapath.com");
db.setDatabaseName("dakapath2");
db.setUserName("root");
db.setPassword("Dapath888$");
if(!db.open()) //如果数据库打开失败,会弹出一个警告窗口
{
QMessageBox::warning(NULL, "警告", "数据库打开失败");
}else{
qDebug() << "Database open successed!";
}
显示数据库连接成功了!!!