2

私は QPainter について学んでおり、ユーザーがウィジェットをクリックするたびにその時点で新しい円が表示される単純なウィジェットを作成しました。

ここに画像の説明を入力

しかし、Qt は paintEvent の外でのペイントを許可していないため、新しい円を描画するたびに、ウィジェット領域を無効にし、以前のすべての円も再描画する必要があります。これはあまり効率的ではないようです。要素が数百または数千ある場合はどうなるでしょうか。

以前の円を消さずに、ウィジェットの上に新しい円を描いただけでよかったのに。しかし、Qt では、最初に前のコンテンツを無効化 (したがって消去) しないと描画できません。

Qtでこの状況を処理するための推奨される方法は何ですか?

4

2 に答える 2

1

このような状況に対処するための推奨される方法は、QGraphicsSceneQGraphicsViewを使用してから、シーンにQGraphicsItemsを設定することです。docsによると、それはまさにフレームワークが設計されているものです。

つまり、 をオーバーライドQGraphicsScene::mousePressEvent()し、新しいメソッドでnew QGraphicsEllipseItem.

于 2012-08-04T20:11:10.867 に答える
1

ウィジェット全体を無効にする必要はありません。update() と repaint() は、再描画したい座標を取得できるため、変更された部分のみを再描画します。

void  update ( int x, int y, int w, int h ) 
void  update ( const QRect & rect ) 
void  update ( const QRegion & rgn ) 

void  repaint ( int x, int y, int w, int h ) 
void  repaint ( const QRect & rect ) 
void  repaint ( const QRegion & rgn ) 
于 2012-08-08T14:18:19.383 に答える