快速QPixmap缩放

时间:2012-05-25 09:55:21

标签: c++ qt zoom scaling qpixmap

我开发了一个类似浏览器的应用程序,其中画布具有较大的高度和“普通”宽度,类似于1024x999999。我使用512个缓存的 QPixmap 块(1024x128)显示图片,重新使用它们来显示新的绘图区域。因此,如果用户滚动大图像的某个给定区域,CPU不忙,则使用缓存的块。所以,这就是我的引擎的工作原理。

想要实现缩放。不知道 - 平滑或离散(x2,x3,x4 ......)。表演问题:

  • 有没有有效的方法在 paintEvent()中即时扩展 QPixmap 而不分配太多内存?
  • 或者我应该考虑“缩放图层”来缓存不同缩放因子的缩放图片?但这使得平滑变焦成为不可能......

1 个答案:

答案 0 :(得分:2)

如果您查看文档,您会发现paintEvent实际上会收到QPaintEvent个对象。此对象有一个名为region()的getter方法,它返回一个QRect,详细说明要重新绘制的区域。

void QWidget::paintEvent ( QPaintEvent * event )
{
  QRect region = event->region();
  ...
}

所以......你只需要重新绘制小部件完全在那个矩形内部分。

对于您的应用程序,我建议您计算矩形中的哪个或哪些图像,并相应地重绘它们,但只绘制那些图像。

对于缩放部分,如果图像是QPainter个对象,Qt已经优化图像在QPixmap个对象中的绘制方式。或者他们说......

因此,您可以在paintEvent()方法内写一些类似的内容:

QPainter painter(this);
...
painter.drawPixmap(pos_x, pos_y, width, height, pixmap);
...

希望有所帮助!