一个用QT写的从MySql导出数据到文本文件的程序_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 1768 | 回复: 0   主题: 一个用QT写的从MySql导出数据到文本文件的程序        下一篇 
leixianp
注册用户
等级:新兵
经验:57
发帖:64
精华:0
注册:2011-7-26
状态:离线
发送短消息息给leixianp 加好友    发送短消息息给leixianp 发消息
发表于: IP:您无权察看 2014-12-11 14:31:45 | [全部帖] [楼主帖] 楼主

程序非常简单,但是俺也从中学到不少东西。有关于QT的小技巧,也有关于MySql的使用。这里记录下来备忘。

1、快速的用QT搭出一个程序的框架。(在集成了Qt插件的vs2008下)

    双击Form Files下的xxx.ui可以进行界面的编辑。拖拽几个按钮,全选它们,右键菜单中选择Lay out,这样就可以使用布局管理自动的对按钮、标签进行排版了。

    点击一个控件,右键菜单选择Connect Signal,QT会自动在主窗口创建on_CtrlName_event()这样的Slot,比如,on_btnFileSave_clicked()。

    Qt设计师会自动在主窗口生成一个Ui::XXXClass ui;的成员变量。在主窗口中,我们可以以ui.CtrlName这样的形式来对控件进行操作,比如更改控件名字等。

    在主窗口构造函数中会调用  ui.setupUi(this);  setupUi是QT设计师根据ui文件的编辑自动生成的函数,并且在函数最后会调用

QMetaObject::connectSlotsByName(xxxClass);     这个函数把控件的singal和我们之前用Qt设计师创建的slot连接起来。

    QT中父窗口会自动调用子窗口、控件的show,所以如果自己添加一个QWidget的话,要保证他的父窗口是可以正常显示的。

    知道以上几步,已经可以写一个QT程序了,因为很多时候我们要做的小工具仅仅一个标签、一个输入框、一个按钮就足够了。剩下的就是在实现程序的过程中,不断加深对QT的熟悉程度与理解。

2、从MySql中导出数据。 如何搭建一个MySql数据库不在这里讨论。事实上,任何一个MySql客户端都可以很方便的从MySql中筛选、导出数据,由于这个工具是要给非专业人员使用的,并且会经常使用,所以需要单独写一个小工具。 这个工具要完成指定功能:把Mysql的一张表进行拆分,写入到两个文件中,并对两个文件进行加密。这个工具要足够简单:只需要一个按钮就可以完成所有操作,这可以降低工作中犯错误的机会。

   虽然MySql提供了很多函数,但是我们只需要用到其中的几个而已(事实上,一开始我使用的是QtSql,并且还捣鼓了半天mySql驱动,但是由于qt的封装考虑的是抽象、是数据库无关,并且它在从Mysql中获取数据后还会进行存储和转换,所以当我写完导出数据时发现,导出一张1w条数据的表耗时竟然超过了20秒。当然,这也可能和我保存数据时使用字符串相加有关)

    MySql的基本使用方法:

//头文件中包含
#include <winsock.h>
#include <Mysql.h>
#pragma comment (lib, "libmysql.lib")
// 下面是使用Mysql的几部曲,放在合适的位置就好
mysql_init(&m_mysql); // MYSQL m_mysql; 这是一个自己写的管理类中的成员变量
mydql_real_connect(&m_mysql, host, user, password, database, 0, "", 0);
// 中间几个参数是建立连接用的主机名等等
char exec[] = "SELECT * FROM item";
mysql_real_query(&m_mysql, exec, sizeof(exec));
// 查询语句 这里关于字符集要说明一下。由于当初建立数据库时用的就是默认的Latin1字符集,我写程序时没有做任何字符集相关的操作,数据显示(包括中文、俄语等等)反而很正常,可能都算作ansi吧。
MYSQL_RES* res = mysql_store_result(&m_mysql); // 保存查询数据,之后的获取数据的操作都依靠res
// 获取field(即字段),总数目。并对字段属性进行一些特殊的判断
// ps:当遍历完一次,再运行mysql_fetch_field就会得到空指针,即,只可对field遍历一次
// ps2:发现个好东东boost::dynamic_bitset<>,运行时动态决定大小的bitset
fieldAmount = mysql_num_fields(res);
boost::dynamic_bitset<> bitset(fieldAmount);
for (int i = 0; i < fieldAmount; ++i) {
MYSQL_FIELD* field = mysql_fetch_field(res);
if (field->flags & ZEROFILL_FLAG) {
bitset.set(i)
// 真正的获取数据,这里使用steam来保存,maybe效率会高些
MYSQL_ROW row = 0;
std::stringstream stream;
while (row = mysql_fetch_row(res)) {
for (int i = 0; i < nFieldAmount; ++i) {
stream << row[i]
// 释放资源
mysql_free_result(res);
mysql_close(&m_mysql);


3、qt中一些杂项的简单用法:

a、QSettings 可以对windows下ini配置文件和注册表进行读写

QSettings config(fileName, QSettings::IniFormat);
hostName = config.value(tr("DefaultConfig/HostName"), tr("127.0.0.1")).toString();
config.setValue(tr("DefaultConfig/HostName"), hostName);


b、QDir   目录操作

// 判断outDir目录是否存在,不存在则创建
QDir dir = QDir::current();
if (!dir.exists(outDir)) {
      dir.mkdir(outDir);
}
// 列出当前目录下指定文件名
QDir dir = QDir::current();
QStringList filter;
filter.append("config*.ini"); // 过滤出类似 config_cn.ini  config_2.ini这样的配置文件
QStringList lst = dir.entryList(filter);


c、设置QT正常显示中文

    在 main函数中

QTextCodec* codec = QTextCodec::codecForName("gbk");
QTextCodec::setCodecForTr(codec);           // tr()就可以正常对中文进行转换了
QTextCodec::setCodecForCStrings(codec);  // QString str = "中文";  这样的写法就正常了


d、限制程序的放大缩小

// 主窗口构造时传参数
MyMainWindow w(0, Qt::WindowCloseButtonHint);  // 不显示最大化、最小化按钮
w.setFixedSize(w.width(), w.height());   // 不可对程序进行拖拽,改变大小


e、修改程序icon

    新建一个rc文件如,Icon.rc,里面添加  IDI_ICON1    ICON    DISCARDABLE    "Res//Icon.ico"

引号中的是图片目录

    在vs2008的工程中,Resource Files下添加此文件

    重新编译工程就好了。

--转自 北京联动北方科技有限公司




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论