qwidget窗口加载图片后无限放大,内存不断增长至GB级别



  • 重写paintEvent,如下代码:
    QPainter painter(this);
    painter.scale((double)this->width() / (double)this->pixmap()->width(),
    (double)this->height() / (double)this->pixmap()->height());
    QPixmap tempPic = (*this->pixmap());
    painter.setRenderHint(QPainter::SmoothPixmapTransform);
    painter.drawPixmap(pixmap()->rect(),tempPic);

    一开始直接使用:
    QPainter painter(this);
    QPixmap tempPic = (*this->pixmap());
    painter.setRenderHint(QPainter::SmoothPixmapTransform);
    painter.drawPixmap(this->rect(),tempPic);

    两种办法均无效。个人认为,只要QT需要画很大面积的图片,内存就会增长。查了一下qpainter有viewport这个属性,qpainterevent事件可以拿到rect(需要绘制的区域)。但如何只画视口区域是一个问题。特来此求教讨论。



  • 当窗口无限放大时,内存能达到2G,而且无法缩小回去(卡死或难以操作)



  • @flowerloveqwidget窗口加载图片后无限放大,内存不断增长至GB级别 中说:

    QPixmap tempPic = (*this->pixmap());

    这个为什么不做成引用呢?虽然是隐式共享的,但是用引用是一个好的点子。
    另外QPainter::scale,这个方法估计比较吃性能,建议做一下性能测试,看哪个函数遇到了瓶颈。



  • @jiangcaiyang123 谢。第二种写法中,即使不在paintEvent里做qpinater::scale操作(或qpixmap的scaled操作),但传入的pixmap和rect区域大小不一致时,qpainter在DrawPixmap时,也会scale。
    这是drawpixmap函数的部分注释内容:\note The pixmap is scaled to fit the rectangle, if both the pixmap and rectangle size disagree.

    我想讨论的内容是:qt将图片画到大尺寸窗口上时占用大内存的问题,是自身问题无法解决吗?



  • @flowerlove 这个我没有详细观察,可能因Qt版本而异。
    如果真的出现了这个问题,那么尝试注释掉关键语句,以确定引起问题的具体部分,具体到函数。
    然后翻看Qt源码,看看函数是如何实现的。
    最后查看一下Qt有没有别的实现,如果没有,那么自己换一种更加高效的方式实现。


 

最近的回复

关注我们

微博
QQ群











召唤伊斯特瓦尔