2

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

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

  • 有没有任何有效的方法可以在不分配太多内存的情况下在paintEvent()中动态缩放QPixmap ?
  • 或者我应该考虑为不同的缩放因子缓存缩放图片的“缩放层”?但这使得平滑缩放变得不可能......
4

1 回答 1

2

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

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

所以...您只需要重新绘制恰好在该矩形内的小部件部分。

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

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

因此,您可以在方法内部编写paintEvent()如下内容:

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

希望有帮助!

于 2012-05-25T17:51:59.390 回答