1

QPainter オブジェクトを使用していくつかのドットを描画する QWidget がありますが、update() メソッドが呼び出されると、QWidget の描画が完全にクリアされます。実際の状態を保存してドットを追加する方法はありますか、またはすべてのドットを保存してすべての paintEvent() 呼び出しでペイントする必要がありますか? 基本的に、矢印を押すと、QWidget に線を表示する必要があります (カー ラリー用です)。

4

3 に答える 3

2

SingerOfTheFallの答えに加えて、すべての増分変更を画像に描画し、各更新呼び出しでこの画像のみを描画することもできます。

画像を操作するために、Qt にはたくさんのクラスがあります。最も重要なのはQImageとです。QPixmapどちらも から派生しQPaintDeviceているため、QPainter. QImage直接ピクセル アクセスとファイル I/O用に最適化されているのに対しQPixmap、 は画面上に表示するために最適化されています。どちらが引き込むのに適しているとは言いませんが、最初QPixmapはどのように機能するかを見ていきます.

描画できる別の「画像」クラスもありますQPictureQPainterしかし、これは実際には結果のレンダリングを格納するイメージではなく、後で簡単に再生できるように で実行された描画コマンドを記録するだけです。したがって、パフォーマンスは「実際の」画像のパフォーマンスよりもはるかに優れているべきではないと思います。しかし、特に描画にもっと複雑なことがあり、最終イメージを保存するだけでは不十分な場合は、試してみる価値があるかもしれません。

于 2012-10-05T07:07:49.583 に答える
1

QPainterそれは彼の目的ではないので、単に「状態」を保存することはできません。それがする唯一のことは絵を描くことです。[x,y] から [x 1 ,y 1 ] に線を引くように指示すると、線が引かれ、すべてが「忘れられます」。それぞれpaintEvent()がゼロからウィジェットのペイントを開始します。したがって、要素を追加するには、毎回既存の要素を再描画する必要があります。

于 2012-10-05T06:46:47.007 に答える
0

QPainterPath楕円をグループ化して「動的な」線を描画できるように、次の方法で問題を解決しました。

QPainterPath* p = new QPainterPath(this); //this should be a class attribute to save all points
p->addEllipse(myCustomPoint); //we should add the points dynamically

QPainter painter(this); // On QPainter::paintEvent;
painter.drawPath(p); 
于 2012-11-05T00:51:47.777 に答える