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,而且无法缩小回去(卡死或难以操作)
-
@flowerlove 在 qwidget窗口加载图片后无限放大,内存不断增长至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有没有别的实现,如果没有,那么自己换一种更加高效的方式实现。