1.15
文件流操作
最简单例子,保存后的文件用记事本打开如下
文本文件流一次流读取是以一个空格为结束,所以保存时在数据中间加入空格
#define SAVE_DATA "J_SAVE.dat"
double XX_Angle=180.1;
CvPoint2D32f OffsetPos(1.1,50.5);
/*实现保存程序运行的数据*/
void MainWindow::saveData()
{
QFile ExpandData(SAVE_DATA);
if(ExpandData.open(QIODevice::WriteOnly))
{
/*文本输出流,用于保存数据*/
QTextStream Out(&ExpandData);
/*加入空格的好处是以流的形式读取恰好是相反的操作,这样一来方便快速对参数的读取*/
Out << XX_Angle;
Out << ' ';
Out << OffsetPos.x;
Out << ' ';
Out << OffsetPos.y;
ExpandData.close();
}
}
/*加载程序运行时保存的数据*/
void MainWindow::loadData()
{
QFile ExpandData(SAVE_DATA);
if(ExpandData.open(QIODevice::ReadOnly))
{
/*文本输出流,用于保存数据*/
QTextStream In(&ExpandData);
In >> XX_Angle;
In >> OffsetPos.x;
In >> OffsetPos.y;
qDebug()<<XX_Angle<<OffsetPos.x<<OffsetPos.y;
ExpandData.close();
}
}
保留2位小数
QString::number(L, 'f', 2)
2.15
做好数据保存功能,便于比较不同算法的差异和复盘
选择保存路径
// "." 代表程序运行目录 ".."上级目录 后面可以接默认文件名
QString filename = QFileDialog::getSaveFileName(this,tr("Save Image"),"./默认文件名",
tr("*.bmp;; *.png;; *.jpg;; *.tif;; *.GIF")); //选择路径 ;;提供多种格式
if(filename.isEmpty())
{ }else{ }
不能在弹出文件框设置文件名,所以只能先预设好。后来发现是因为Camera类中设置了grabKeyboard(),键盘事件都被它捕获了,其它部件即使获得焦点也不能响应键盘事件,取消后正常,但camera不能一启动就能响应键盘了。
解决:camera->setFocus(),这样程序启动后焦点就在camera上,可以响应键盘事件。camera的focusPolicy设为StrongFocus,其它子控件设为NoFocus,否则setFocus()会有子控件被设为当前焦点。
选择要打开的文件
单个文件
QString filename=QFileDialog::getOpenFileName(this, "打开文件", "","*.dat");
多个文件
QStringList filenames=QFileDialog::getOpenFileNames(this, "打开文件", "","*.dat");
for (auto tmp : fileNames)
{
QString filename=tmp;
//对文件的操作
}
查找整个文件夹文件并筛选
/*******************************
* 导入文件夹的图片
* ****************************/
void Camera::on_openDirBt_clicked()
{
QString srcDir = QFileDialog::getExistingDirectory(this,"选取文件夹", "./");
SourceDir.setPath(srcDir);
SourceDir.setFilter(QDir::Files | QDir::NoSymLinks);
//QStringList FilesList = SourceDir.entryList();
QStringList ImgFilter;
//过滤器
ImgFilter << "*.JPG"<<"*.png";
//定义迭代器并设置过滤器
QDirIterator dir_iterator(srcDir, ImgFilter, QDir::Files | QDir::NoSymLinks, QDirIterator::Subdirectories);
while (dir_iterator.hasNext())
{
dir_iterator.next();
QFileInfo file_info = dir_iterator.fileInfo();
QString file_path = file_info.absoluteFilePath();
SourceFilesList.append(file_path);
}
CurImgNum = 0;
ui->curImgNumLabel->setText(QString::number(CurImgNum+1)+" / "+
QString::number(SourceFilesList.size()));
}
//上一张
void Camera::on_ThumbRightBtn_clicked()
{
CurImgNum = (CurImgNum==SourceFilesList.size()-1)? 0 : CurImgNum+1;
QString curImgPath = SourceFilesList.at(CurImgNum);
//获取图片
Mat img=imread( curImgPath.toStdString()) ;
imgProcess(img);
ui->curImgNumLabel->setText(QString::number(CurImgNum+1)+" / "+
QString::number(SourceFilesList.size()));
}
//下一张
void Camera::on_ThumbLeftBtn_clicked()
{
CurImgNum = (CurImgNum==0)? SourceFilesList.size()-1 : CurImgNum-1;
QString curImgPath = SourceFilesList.at(CurImgNum);
//获取图片
Mat img=imread( curImgPath.toStdString()) ;
imgProcess(img);
ui->curImgNumLabel->setText(QString::number(CurImgNum+1)+" / "+
QString::number(SourceFilesList.size()));
}
windows的文件路径分隔符是\,而linux的分隔符为/,
要实现window下编写的程序直接应用到linux下, 在构造文件路径时,可以用QDir::toNativeSeparators
file_path = QDir::toNativeSeparators(file_path);
图片QPixmap保存
新建一个空QPixmap图片并填充
QPixmap eyePix=QPixmap(40,30);
eyePix.fill(Qt::transparent);
保存,注意图片格式要大写
eyePix.save(QString::number(CurImgNum),"PNG");