2

キャンバスの高さが大きく、「通常の」幅 (1024x999999 など) のブラウザーのようなアプリケーションを開発しています。キャッシュされた 512 個のQPixmapブロック (1024x128) を使用して画像を表示し、それらを再利用して新しい描画領域を表示します。したがって、ユーザーが大きな画像の特定の領域をスクロールすると、CPU はビジーではなく、キャッシュされたブロックが使用されます。つまり、これが私のエンジンの仕組みです。

ズームを実装したい。不明 - スムーズまたは離散 (x2、x3、x4...)。パフォーマンスに関する質問:

  • メモリをあまり割り当てずに、 paintEvent()でオンザフライでQPixmapをスケーリングする効果的な方法はありますか?
  • または、さまざまなズーム倍率でズームされた画像をキャッシュする「ズームレイヤー」について考える必要がありますか? しかし、これではスムーズなズームができなくなります...
4

1 に答える 1

2

ドキュメントを見ると、paintEvent実際にオブジェクトを受け取っていることがわかりQPaintEventます。このオブジェクトには、再描画される領域の詳細region()を返すという名前のgetterメソッドがあります。QRect

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

だから...あなたはちょうどその長方形の中に正確にあるウィジェットの部分を塗り直す必要があります。

アプリケーションの場合、長方形内にある1つまたは複数の画像を計算し、それに応じて再描画することをお勧めしますが、それらの画像のみです。

ズーム部分については、Qtは、画像がオブジェクトである場合に、画像がオブジェクトにペイントされる方法を最適化しました。またはそう彼らは言う...QPainterQPixmap

したがって、paintEvent()メソッド内に次のように記述できます。

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

お役に立てば幸いです。

于 2012-05-25T17:51:59.390 に答える