0

Qt 4.7.1 Windows アプリでは、QGraphicsScene::changed() に接続されているスロットが期待どおりに起動されますが、ダーティ リージョン カウントは常に 1 であり、得られる rect サイズは常にアプリ ウィンドウと同じです。QGraphicsView::setViewportUpdateMode(QGraphicsView::MinimalViewportUpdate); を呼び出してみました。しかし、それは役に立ちませんでした。

変更されたページの領域のみを提供するように Qt に指示する方法はありますか?

4

1 に答える 1

2

の更新は、の更新とQGRaphicsViewは異なりQGraphicsSceneます。ビューの更新は、ビューを再描画する必要があるために発生します。シーンの変更の有無にかかわらず。これは典型的なもので、ウィンドウ(サイズ変更)とビューの変更(スクロール)からのものです。シーンを変更すると、ビューも更新されます。

シーンの変更は、シーンのコンテンツの変更です。アイテムの追加または削除、変換のスケーリングまたは変換と同様です。これによりchanged()信号が発信されます。そのシーンを表示しているすべてのビューも、表示用に更新されます。

例えば。ビューをスクロールしても、シーン内の何も変更されていないため、シーンの更新は生成されません。paint()シーン内のアイテムの関数は、再描画するために呼び出されます。ただしchanged()、シーンから信号は送信されません。

たとえば、シーンのスケールを変更すると、シーン全体が変更されます。全体の塗り直しに加えて、シーンは信号を発し、シーンchanged()全体が変更されたことを示します。ただし、シーンに新しいアイテムを追加する場合、changed()は新しいアイテムのrectのみを示す必要があります。

シーンのどの部分を再描画する必要があるかを知りたい場合は、を呼び出すQGraphicsView::setViewportUpdateMode()だけでなく、ビューにイベントフィルタをインストールして、を確認する必要がありますQEvent::Paint。QPaintEventの領域とrectはビューのローカル座標にあり、シーンとは異なる場合があることに注意してください。しかしQGraphicsView、変換を行うための多くのマッピング関数があります。

于 2011-02-05T22:18:11.950 に答える