写在前面:
一边用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
设计思路:
这里拿张软件截图讲起来比较方便。
- 实现pcd到txt的相互转换
- 通过拖放的方式来进行(多个)文件的导入,并显示导入文件的名字
- 点击转换按键进行文件的转换工作,并输出转换后文件名
- 外加能反馈软件状态的信息框
设计过程:
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(
点此下载)。