2

水平レイアウト内にQGraphicsViewがあります。QGraphicsシーンに含まれるQGraphicsSceneはかなり大きい(数千ピクセル)ため、ビューをスクロールできるように、デフォルトでスクロールバーが表示されます。

グラフィックシーン内のシーンを更新するたびに、古いシーンを削除し、新しいシーンを作成してオブジェクトを入力し、view-> setScene(scene)を呼び出します。ただし、これを行うと、スクロールバーはデフォルトで、元の場所にとどまるのではなく、QGraphicsViewの左上隅になります。

シーンを破棄する前にQGraphicsScene::sceneRectを保存し、その後setSceneRect()を実行して復元しようとしましたが、シーン自体にのみ影響し、シーンを表示しているQGraphicsViewには影響しないため、機能しません。また、view-> verticalScrollBar()-> setValue()を実行しようとしましたが、スクロールバーにはまったく影響がないようです。

デフォルトで作成されたスクロールバーにアクセスして、以前に保存された値に設定するにはどうすればよいですか?

4

2 に答える 2

1

新しいシーンが設定されるまで前のシーンを削除しないことで修正されました。

例えば

QGraphicsScene *previousScene = scene;
scene = new QGraphicsScene(0, 0, levelPlist.value("level_width").toInt(), levelPlist.value("level_height").toInt());

// config scene

QGraphicsView *view = ui->graphicsView;
view->setScene(scene);

delete previousScene;
于 2011-07-21T19:01:42.097 に答える
0

考えられる解決策を提示する前に、シーンを破壊しないアプローチを強くお勧めします。シーンをクリアするだけの場合は、クリアする前にsetSceneRect()を呼び出すことができるはずです。これにより、シーンが自動的に四角形のサイズを変更するのを防ぐことができます。再設定されたら、デフォルトで構築されたQRectを使用してsetSceneRect()を呼び出し、rectのサイズをもう一度制御できるようにします。

記載されているようにスクロールバーを本当に保存/復元する必要がある場合は、過去に次のアプローチが有効でした。

私は(さまざまな理由で)同様のことをしなければなりませんでした、そして私が思いついた最良の解決策は次のようなことをすることを含みます:

  • シーンをクリアする前に、垂直および水平スクロールバーの位置を保存してください
  • シーンを再構築する前に、キューに入れられたシグナル/スロット接続を使用してQScrollBar :: rangeChanged()シグナルに接続します。この信号は、シーンを再作成した後に発生するはずです。これは、ビューによってスクロールバーが再構成されたことを示します。
  • スロットで、rangeChanged()信号から切断し、スクロールバーの位置を復元します

これにより、ちらつきやジャンプが発生することがほぼ保証されていることに注意してください。

于 2011-07-21T18:49:41.843 に答える