精英盒子 -> 程序设计 -> QtSQL-Windows下从MySQL驱动的编译到Demo的编写 [打印本页]

jybox 2012-01-21 01:18

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模块:
  1. QT       += core gui sql



在Widget的构造函数加入下面这样的语句,输出可用驱动(当然,你可能需要包含一些头文件)
  1. 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中加入下面的声明
  1. #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查询语句:
  1. const QString QuerySQL="SELECT * FROM `user`";
接下来是构造函数,构造函数的任务是,初始化数据库连接,然后初始化数据库查询模型对象,将数据表中的数据呈现输出来(你自己包含头文件吧):

  1. 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);//把模型绑定到视图
    }

然后是注册按钮的槽函数:
  1. 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]







Powered by phpwind v8.7 Code ©2003-2011 phpwind
Time 0.038308 second(s),query:4 Gzip enabled