2011-11-13 8 views
1

QGraphicsPixmapitemアイテムの矩形として構築されたマップを表示しています(各アイテムは1つのマップタイルを表します)。私のマップはかなり大きい(約30MBのPNGファイル)ため、QGraphicsViewでユーザが見ることができ、不可視になったときにアンロードするときにのみ、ピックスマップをオンデマンドでロードできるようにしたい。QGraphicsViewの可視シーン矩形を取得するには?

可視のシーン矩形を見つける方法はありますか?

+2

これはあなたが探していると思います。http://stackoverflow.com/questions/1355446/get-visible-rectangle-of-qgraphicsview –

答えて

1

QGraphicsViewはQWidget :: geometry()関数を継承します。これを使用して、親ウィジェット内での位置とサイズを判断できます。 (コンストラクタの外側)

QGrapicsSceneはQGraphicsViewよりも大きくなる可能性があります。デフォルトのQGraphicsViewは、QGraphicsSceneを格納するための水平スクロールバーと垂直スクロールバーを追加します。私はあなたがこのような何かをしたいと思います想像:

//create a QGraphicsScene (for this example *scene) that is the size of your entire map. 
QGraphicsScene *scene=new QGraphicsScene(0,0,mapWidth,mapHeight); 
//create a QGraphicsView* named view that is the size of your visible area 
//I'm assuming visibleHeight and visibleWidth do not change (this is your viewing window) 
QGraphicsView *view=new QGraphicsView(0,0,visibleWidth,visibleHeight); 
view->setScene(scene); 

は、ユーザーが sceneMoved(int,int)のようないくつかのカスタム信号をトリガーするシーンのxとyの位置を制御してもらいます。あなたがシーンを再描画する前に、シーンの新しい位置を確認するためにスロットを呼び出します。

connect(this,SIGNAL(sceneMoved(int,int)),this,SLOT(drawScene(int,int))); 

void SomeClass::drawScene(int newX, int newY){ 
//if you already have a pointer to the scene do this, or call 
//QGraphicsView::scene(); 
    int oldX=scene->geometry()->x(); 
    int oldY=scene->geometry()->y(); 
    //now that you have your oldX, oldY, newX, and newY, visibleWidth, visibleHeight 
    //you can determine what you need to redraw, what you need to delete, and what can stay 
} 

ありif..elseの多くはまだですが、あなたはポイントを得ます。あなたの目に見えるエリアの大きさにあなたのマップを四角形に分けることをお勧めします。

+0

sceneMovedシグナルとは何ですか? Qt4には存在しません。 – rednaks

+0

これは、ユーザーがトリガーするカスタム信号です。それは明確化が必要でした。 – buster

3

これは、あなたの目に見えるシーン矩形与える:ここで

sceneRect = graphicsView.mapToScene(graphicsView.rect()).boundingRect() 

を剪断または回転変換は、それはあなたの目に見えるシーンの領域の外接矩形を与える存在です。このような変換(シフトまたはズームのみ)がない場合、返される矩形は正確なシーン領域です。

シーン内に巨大なタイルマップを効率的に表示するための本当の問題はありますか?バックグラウンドでタイルを読み込んで、可視範囲外の大きなpixmap用にQtフレームワークがまだ最適化されていないかどうかを最初に評価することができます。 30 MBもそれほど大きくないのでメモリに収まりません。

関連する問題