2011-07-21 38 views
2

私はQGraphicsViewを水平レイアウトの中に持っています。 QGraphicsシーンに含まれるQGraphicsSceneはかなり大きく(数千ピクセル)、デフォルトではスクロールバーが表示され、ビューをスクロールできます。qt scrollviewの位置を取得

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

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

私のために作成されたスクロールバーには、どのようにアクセスして以前に保存した値にすることができますか?

+1

シーンを更新して削除して再作成する必要があるシーンでは何が起こっていますか? –

答えて

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; 
0

私は可能な解決策を提供する前に、あなたのシーンを破壊することを含まないアプローチを強くお勧めします。あなたのシーンをクリアしているだけの場合は、クリアする前にsetSceneRect()を呼び出すことができます。これによりシーンが自動的にrectのサイズ変更をしなくなります。再構築されると、デフォルトで構築されたQRectでsetSceneRect()を呼び出して、rectのサイズを再度制御することができます。

あなた本当に述べたように、スクロールバーを保存/復元する必要があり、次のようなアプローチは、過去に私のために働いている場合:私は(別の理由のために)似た何かを持っていた

をし、 QScrollBarに接続し、シーンを再構築する前に、あなたの垂直および水平スクロールバー

  • の位置をオフに保存し、シーンをクリアする前に

    • :: rangeChangedを:私が作ってみた最善の解決策は、このような何かをやって関係します()シグナルと信号/スロット接続待ち。この信号は、シーンを再投入した後に起動する必要があり、スクロールバーがビューによって再構成されたことを示します。
    • あなたのスロットに
    • 、rangeChanged()信号からの切断、およびスクロールバーの位置を復元

    これはかなりのいくつかのちらつき/飛びを起こすことが保証されることに注意してください。

  • 関連する問題