QT中用QImage读取图片后,软件内存占用很大(同时发现用QFileDialog打开关闭对话框会引起内存不断增加)

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);
后续代码通方法二

通过上述三种方式来打开关闭对话框,发现内存都会不断增加,至此我没找到合适的解决方法,如果有哪位大神能给予解答,鄙人不甚感激!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GreenHandBruce

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值