Qt初级:基于拖放操作和文件流操作的文件转换小助手

来源:互联网 发布:2016nba数据库排名 编辑:程序博客网 时间:2024/05/16 23:52

写在前面:

        一边用Matlab一边用VS,一边txt一边PCD。每次纯手动转换着实让人愤怒,再加上刚刚出炉的50来组数据,看着就让人失去了欲望。刚好最近在学Qt而我使用的数据大多为PointXYZ型的PCD文件,于是写个PCD与txt相互转换的小软件的想法油然而生。说干就干,Let’sgo。
        对了这里得提一下我的两本参考书:《C++GUI Qt 4编程(第二版)》,《QtCreator快速入门(第二版)》。

软件配置:

        国际惯例,先罗列下开发环境,以免给使用不同软件版本的朋友带来不便。
  • 操作系统:Win 7 64bit SP1
  • IDE:VisualStudio 2010 SP1
  • IDE:QtCreator 3.1.2 (Open Source)
  • Qt:Version4.8.0

设计思路:

   
        这里拿张软件截图讲起来比较方便。
  1. 实现pcd到txt的相互转换
  2. 通过拖放的方式来进行(多个)文件的导入,并显示导入文件的名字
  3. 点击转换按键进行文件的转换工作,并输出转换后文件名
  4. 外加能反馈软件状态的信息框

设计过程:

UI设计:


        如图所示,本软件基于Dialog设计:4个Labels,2个QListWidget(作为Input和Output Pool),1个pushButton(用于转换操作),2个Spacer,2个RadioButton(转换状态选择),1个QTextBrowser(软件状态反馈)。具体的布局过程我就不多说了。

核心代码实现:

        (1)drag and drop拖放操作
        对了,我这里转换的只是ASCII的文件,所以使用的MIME(具体信息自行搜索)类型。所以我添加了类:classQMimeData。
        对于拖放操作,我们采用Qt的事件机制来完成它,这里我们只需要两个函数:void dragEnterEvent(QDragEnterEvent *event)抓取释放操作和void dropEvent(QDropEvent *event)释放操作。
        首先我们讲解第一个函数(事件),其实它是指抓取目标并移动到可释放区域的过程,其具体实现如下:
void TransformerDialog::dragEnterEvent(QDragEnterEvent *event){    // 省略部分代码    if(event->mimeData()->hasUrls()){        event->acceptProposedAction();    } else {        event->ignore();    }  }
        其意义为:当拖拽的文件包含MIME类型且hasUrls时接受这个操作,否则忽略这个操作。
        第二个函数(事件),指释放目标,也就是真正输入的操作,其具体实现如下:
void TransformerDialog::dropEvent(QDropEvent *event){    QList<QUrl> urls = event->mimeData()->urls();    QString fileName = urls.first().toLocalFile();    // 省略部分代码}
        这里我使用了容器QList和类型QUrl来存储拖入目标的位置和文件名,这样就可成功实现(多个)文件输入了,当然接下来的代码可以实现滤掉一些文件(如.exe等)的功能。
        (2)transformer 文件转换
        这是本软件的另一个核心内容,这里主要使用的是Qt的文件流,其实这个跟标准C++的文件流差不多:
        读文件:这里我采用了最简单的读取方式lineby line
QFile infile(localFile.at(i));if(infile.open(QFile::RealOnly)) {    QTextStream in(&infile)    QString line;    while(!in.atEnd()) {        line = in.readLine();    }}
        写文件:也很简单
OFile outfile(outputFileName.at(i));if(outfile.open(QFile::WriteOnly())) {    QTextStream out(%outfile);    out << "需要写入的文字" << endl;}
        总结:最后大家就可以使用Qt中以上两个简单的功能实现文件的转换操作了,当然加上多线程就会避免程序出现假死的状况,程序的源码我已经上传到CSDN(点此下载)。




0 0
原创粉丝点击