QT版本:Qt 5.5.1 (MSVC 2013, 32 bit)
Qt Creator版本:Qt Creator 3.5.1 (opensource)
系统:win10
编写了一个小功能:用户点击一个按钮——弹出QFileDialog对话框——用户选择n张图片并点击确定后——程序将图片存放至一个QImage类型的QList中——在界面上用label显示用户选中的第一张图
QList<QImage> m_qlistLoadImgs;
void DebugWindow::open()
{
QFileDialog *fileDlg = new QFileDialog(this);
fileDlg->setWindowTitle("Choose Pictures");
QStringList qstrFilters;
qstrFilters<<"Image files(*.bmp *.jpg *.pbm *.pgm *.png *.ppm *.xbm *.xpm)";
qstrFilters<<"Any files (*)";
fileDlg->setNameFilters(qstrFilters);//设置文件过滤器
fileDlg->setFileMode(QFileDialog::ExistingFiles);//设置能选择多个文件,如果是单个文件就写成QFileDialog::ExistingFile
if(fileDlg->exec() == QDialog::Accepted)
{
QStringList strPathList = fileDlg->selectedFiles();
if(!m_qlistLoadImgs.empty())
{
m_qlistLoadImgs.clear();
}
QPixmap pixmapTemp;
for(int i = 0;i<strPathList.count();i++)//
{
pixmapTemp.load(strPathList[i]);
m_qlistLoadImgs.push_back(pixmapTemp.toImage());
}
if(!m_qlistLoadImgs[0].isNull())
{
QPixmap crtPixmap = QPixmap::fromImage(m_qlistLoadImgs.at(0));
int with = ui->label_pic->width();
int height = ui->label_pic->height();
crtPixmap= crtPixmap.scaled(with, height, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); // 饱满填充
ui->label_pic->setPixmap(crtPixmap);
}
}
else
{
QMessageBox mesg;
mesg.warning(this,"警告","打开图片失败!");
}
fileDlg->close();
delete fileDlg;
fileDlg = NULL;
}
程序运行后,发现我导入一张536KB的jpg图片,从资源管理器中查看软件内存会增加接近10M。
后来研究了一下QImage,发现用QImage存放的图片一个像素占用4个字节,而我之前导入的jpg图片分辨率为19201200,因此存放到QImage中之后占用字节数为1920120*4=9216000字节这个和通过QImage.byteCount()获取到的字节数相同)=8.799M。
但8.799M<10M,另外的2.2M被谁吃了?
后来我发现每次打开QFileDialog,即使什么都不操作,直接关闭,软件占用内存都会增加100KB左右,但每次增加的具体数值不一样,即使我在关闭对话框后加上
fileDlg->close();
delete fileDlg;
fileDlg = NULL;
也没改善占用内存增加的问题。
我一共用如下3中方法打开文件:
方法一:
QStringList strPathList =QFileDialog::getOpenFileNames(this,tr("Open image file"),"",tr("Image files(*.bmp *.jpg *.pbm *.pgm *.png *.ppm *.xbm *.xpm);;""Any files (*)"));
方法二:
QFileDialog *fileDlg = new QFileDialog(this);
fileDlg->setWindowTitle("Choose Pictures");
QStringList qstrFilters;
qstrFilters<<"Image files(*.bmp *.jpg *.pbm *.pgm *.png *.ppm *.xbm *.xpm)";
qstrFilters<<"Any files (*)";
fileDlg->setNameFilters(qstrFilters);//设置文件过滤器
fileDlg->setFileMode(QFileDialog::ExistingFiles);//设置能选择多个文件,如果是单个文件就写成QFileDialog::ExistingFile
if(fileDlg->exec() == QDialog::Accepted)
{
QStringList strPathList = fileDlg->selectedFiles();
}
fileDlg->close();
delete fileDlg;
fileDlg = NULL;
方法三:
将QFileDialog *fileDlg = new QFileDialog(this);改为QFileDialog filedlg(this);
后续代码通方法二
通过上述三种方式来打开关闭对话框,发现内存都会不断增加,至此我没找到合适的解决方法,如果有哪位大神能给予解答,鄙人不甚感激!