1 遇到的问题
Qt后面的版本都没有直接带Mysql插件驱动了,应该是协议的原因,需要我们自己手动编译下,默认是这样子的:
打印下QSqlDatabase::drivers()结果如下:
("QSQLITE", "QODBC", "QODBC3", "QPSQL", "QPSQL7")
很显然,默认是不包含Mysql的插件驱动。
如果使用QSqlDatabase::addDatabase("QMYSQL")去加载插件,就会报下面的错误:
QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QODBC QODBC3 QPSQL QPSQL7
这个错误是不是很经典,网上也有很多编译插件的教程,但是居然没有一篇文章是完全能够解决问题的,一定要综合多篇文章一起才行,所以还得要自己多动动手才行,下面我们来看看解决办法。
2 解决办法
2.1 下载源码
如果安装Qt时勾选了源码,这步就可忽略,但是大多数人安装时是没有勾选的,可以自己去下载一下:
附加地址https://download.qt.io/archive/qt/5.12/5.12.6/submodules/
这里根据自己的版本下载即可。
2.2 解压源码
如果安装Qt时勾选了源码,这步也可忽略,这里只提一点,解压时一定要整个目录一起解压,不然会影响后面的配置:
解压目录自己可以随便指定,一定要全部一起解压,我这里解压到了D:/QtPro目录下。
2.3 打开mysql.pro工程
首先打开工程文件:
打开后无非会遇到下面两种错误:
Project ERROR: Library 'mysql' is not defined.
Cannot read D:/qtsqldrivers-config.pri: No such file or directory
为了解决这个问题,接下来我们修改下配置。
2.4 修改工程文件
修改mysql.pro文件如下:
这里额外提示下,如果本地没有安装mysql数据库,可以下载对应的zip包,里面有对应的头文件和库文件,例如我这里服务器的版本是mysql-5.7.9,所以我下载的版本是mysql-5.7.9-winx64.zip,并解压到了D:/Program目录下:
然后,修改qsqldriverbase.pri文件如下:
好了,上面提到的两个错误到这里就解决了,下面开始编译。
2.5 编译一下
编译完成后,会在指定的build目录下生成插件驱动:
2.6 部署一下
首先将编译生成的mysql插件驱动复制到sqldrivers目录下:
然后再将Mysql驱动复制到Qt安装目录bin目录下:
3 验证一下
首先使用QSqlDatabase::drivers()打印下:
("QSQLITE", "QMYSQL", "QMYSQL3", "QODBC", "QODBC3", "QPSQL", "QPSQL7")
很显然,Mysql插件驱动已经安装成功了。
下面测试下能不能连接到数据库:
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("192.168.10.5");
db.setUserName("root");
db.setPassword("123456");
db.setPort(3306);
qDebug() << db.open() << db.lastError().text();
结果打印如下:
好啦,搞定!此方法应该对其他版本也适用,需要自行去测试。
最后提一下,我们编译的插件qsqlmysql.dll是依赖于Mysql驱动libmysql.dll的,两者缺一不可,插件就像是中间转换层一样,会对Mysql驱动进行适配,直接调用是不行的。