QtSQL-Windows下从MySQL驱动的编译到Demo的编写
首先,Qt的Windows版是不自带Mysql驱动的,需要自己编译 所以先编译MySQL For Qt的驱动 这里,我的Qt版本是4.7.4,系统是Windows 7-64bit,MySQL是5.5.2,Mingw.....这个版本我没搞清,反正应该是最新的
首先确认你安装了Qt库,没有安装的话,可以参考这里http://0-ms.org/wiki/build 然后把其中qmake.exe所在目录加入系统path,我这里是C:\Qt\4.7.4\bin 再把mingw32-make.exe和g++所在目录加入系统path,我这里是C:\MinGW\bin
然后确认你安装了mingw-utils,这个工具集好像不是默认包含在mingw里的,请在这里下载http://www.qtcn.org/download/mingw-utils-0.3.tar.gz 然后解压后,将其中的bin目录加入系统path,我这里是C:\mingw-utils-0.3\bin
要注意上面几个路径都不要包含空格和中文字符
然后下载MySQL,在这里http://www.mysql.com/downloads/mysql/5.5.html 下载后安装,安装时要把全部的组建都安装上 选择安装路径的时候要选择一个没有空格和中文字符的路径,注意,这个安装程序默认的安装路径是有空格的 例如我安装到了C:\mysql
mysql默认提供的导出库是给vc++用的,如果用mingw编译的话,必须制作一个mingw用的导入库 切换到mysql目录下的lib目录(我这里是C:\mysql\lib),然后执行下面的命令:
reimp -d libmysql.lib dlltool -k -d libmysql.def -l libmysql.a
这里就生成了mingw用的导入库:libmysql.a
下面开始编译Qt的MySQL驱动 切换到%QTDIR%\src\plugins\sqldrivers\mysql目录,%QTDIR%是指Qt库的安装路径,我这里是C:\Qt\4.7.4\ 执行下面的命令(其中路径可能需要改),先生成MakeFile,然后编译qmake -o Makefile "INCLUDEPATH+=C:\MYSQL\INCLUDE" "LIBS+=C:\MYSQL\LIB\libmysql.a" mysql.pro make make release
执行后,会在%QTDIR%\src\plugins\sqldrivers\mysql生成两个目录:debug和release 其中的 libqsqlmysqld4.a、qsqlmysqld4.dll、libqsqlmysql4.a、qsqlmysql4.dll就分别是debug和release模式下的导入库和动态链接库 需要把他们复制到%QTDIR%\plugins\sqldrivers\
Qt中的数据库驱动是以插件的形式存在的,应该放在相对于应用层实在目录的plugins\sqldrivers中 我们可以新建一个这样的目录,然后把上面的dll文件(.a文件不必)复制进来
然后呢,其实这个mysql for qt只是个接口,还是要依赖mysql提供的库,我们需要把C:\mysql\lib\libmysql.dll复制到应用程序的目录
然后创建一个qt界面程序,基于QWidget的 先在pro文件中加入sql模块:
在Widget的构造函数加入下面这样的语句,输出可用驱动(当然,你可能需要包含一些头文件)
- qDebug()<<QSqlDatabase::drivers();
如果见到输出的调试信息中包含QMYSQL,那么说明mysql数据库驱动配置好了,比如像下面这样
("QSQLITE", "QMYSQL3", "QMYSQL", "QODBC3", "QODBC")
上面说的有点迷糊,可能大多数人没听懂这些库究竟怎么放 下面总结一下:
%QTDIR%\plugins\sqldrivers\需要有: libqsqlmysqld4.a、qsqlmysqld4.dll、libqsqlmysql4.a、qsqlmysql4.dll
应用程序目录: 我的程序.exe libmysql.dll \plugins\sqldrivers\qsqlmysqld4.dll(和下面的文件二选一,要看你是debug还是release) \plugins\sqldrivers\qsqlmysql4.dll
然后我们接着编写我们这个小demo 我们要实现两个简单的功能:插入数据和查看数据 作为例子,我们以一个很典型,很简单的用户表做例子: 你可以用下面的SQL语句来建立数据表(你可以在phpmyadmin中执行):
CREATE TABLE `user` ( `uid` int(11) NOT NULL auto_increment, `uname` varchar(255) NOT NULL, `pwd` text NOT NULL, PRIMARY KEY (`uid`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
然后我们假设我们的mysql数据库在本地、数据库名是zeroms、用户名是root、木有密码
Qt的QSqlDatabase表示一个数据连接 QSqlQueryModel表示一个查询模型....这个算是MVC里的概念 QSqlQuery表示一个查询 同时,Qt的QTableView是一个视图,可以展示来自QSqlQueryModel的数据,我们用它来显示数据
首先在widget.ui中创建如下的界面: [attachment=238]
然后在widget.h中加入下面的声明
- #include <QWidget>
class QSqlDatabase;//前置声明 class QSqlQueryModel;
class Widget:public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); private slots: void on_DoInsert_clicked();//注册按钮的槽函数 private: QSqlDatabase *db;//数据库连接对象 QSqlQueryModel *model;//数据库查询模型对象 Ui::Widget *ui; };
然后我们还可以定义一个常量,存储SQL查询语句:
- const QString QuerySQL="SELECT * FROM `user`";
接下来是构造函数,构造函数的任务是,初始化数据库连接,然后初始化数据库查询模型对象,将数据表中的数据呈现输出来(你自己包含头文件吧):
- Widget::Widget(QWidget *parent):QWidget(parent),ui(new Ui::Widget)
{ ui->setupUi(this);
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));//设置默认编码 QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
this->setWindowTitle(tr("MySQL数据库插入和检索"));
db=new QSqlDatabase(QSqlDatabase::addDatabase("QMYSQL"));//驱动名称,也就是数据库类型 db->setHostName("127.0.0.1");//服务器地址 db->setDatabaseName("zeroms");//数据库名 db->setUserName("root");//用户名 db->setPassword("");//密码
if(!db->open()) { qDebug()<<db->lastError().text();//如果没有打开成功,输出错误信息 return; }
model=new QSqlQueryModel; model->setQuery(QuerySQL,*db);//在模型中创建查询
ui->tableView->setModel(model);//把模型绑定到视图 }
然后是注册按钮的槽函数:
- void Widget::on_DoInsert_clicked()
{ QSqlQuery query=model->query();//从模型获得一个查询对象 query.prepare("INSERT INTO `user` (`uname`,`pwd`) VALUE (:uname,:pwd)"); //创建查询,参数可以先用占位符表示 query.bindValue(":uname",ui->UNameInput->text());//填充占位符 query.bindValue(":pwd",ui->PWDInput->text()); query.exec();//执行查询
model->setQuery(QuerySQL,*db);//刷新模型中的数据 }
还是那句话,这里发代码的效果不理想,你可以去代码托管查看https://github.com/jybox/MyWorks/tree/master/SQL-Demo 同时那里的左上角有打包下载源代码的选项
最后贴一个效果图 [attachment=239]
|