2009-07-09 19 views
2

私は、(Py)QtアプリケーションのQGraphicsViewでスクロール/パン機能を実装したいと思っています。これは次のように動作するはずです:ユーザはマウスの中ボタンを押し、ユーザがマウスを動かすとビューがスクロールします(これはかなり共通の機能です)。
QWidgetから継承したscroll()メソッドを使用してみました。しかし、これは何とか代わりにスクロールバーとすべてのビューを移動します。画像を参照してください。
これは私がこれを行う方法ではないので、どうすればよいですか?それとも正しい方法ですか、私は何か間違っていますか?私が使用するコード:プログラムによるQGraphicsViewのスクロール

def __init__(self): 
     ... 

     self.ui.imageArea.mousePressEvent=self.evImagePress 
     self.ui.imageArea.mouseMoveEvent=self.evMouseMove 

     self.scrollOnMove=False 
     self.scrollOrigin=[] 

     ... 

    def evImagePress(self, event): 
     if event.button() == Qt.LeftButton: 
      self.evImageLeftClick(event) 
     if event.button() == Qt.MidButton: 
      self.scrollOnMove=not self.scrollOnMove 
      if self.scrollOnMove: 
       self.scrollOrigin=[event.x(), event.y()] 
    ... 

    def evMouseMove(self, event): 
     if self.scrollOnMove: 
      self.ui.imageArea.scroll(event.x()-self.scrollOrigin[0], 
            event.y()-self.scrollOrigin[1]) 

私は全体の移動・ウィジェットの事業を除き、期待通りに動作します。

Fails to scroll http://img55.imageshack.us/img55/3222/scrollfail.jpg

+0

どのようなウィジェットタイプはself.ui.imageAreaありますか?それはQScrollArea、QGraphicsAreaなのでしょうか? –

+0

ああ、テキストではなく、タイトルでそれを言及しなかった。これはQGraphicsViewです。 – carlpett

+0

ビューが表示しているQGraphicsScene内のQScrollAreaはありますか? –

答えて

3

私自身はこれを行っていないが、これはQGraphicsViewドキュメント

...シーンはスクロールバーの値よりも 大きい場合、あなたは に選択することができますからです代わりにtranslate()を使って のシーンをナビゲートしてください。

あなたがウィジェットを移動しているscrollを使用することにより、translateは、ビューの下QGraphicsSceneの内容を移動し、探しているものを達成する必要があり

QGraphicsViewで表示されます
+0

さて、シーンはスクロールバーの許容値よりも大きくないので、問題ではありません。しかし、私も翻訳を試みましたが、それだけでイメージを前後に振ってしまいました。私はそれが自動的に再中心化されたと思いますか? – carlpett

+0

私はドキュメントを見ていますが、 'setDragMode(QGraphicsView :: ScrollHandDrag)'を試みて、 'interactive'の値が' true'になっていますか? –

+7

翻訳し直してください view.setTransformationAnchor(QtGui.QGraphicsView.NoAnchor) else translate()はnoopですか? – denis

0
あなたがQGraphicsSceneのエリアを設定することができます

方法はQGraphicsView::setSceneRect()です。ボタンを押してマウスを動かすと、シーンの表示部分の中心を変更して目標を達成することができます。

4

私はtranslate()メソッドに加えました。 シーンを拡大/縮小しない限りうまくいきます。これを行うと、画像がマウスの動きと同期していないことがわかります。それはmapToScene()が助けになるときです。ポイントをマウスイベントからシーン座標にマッピングする必要があります。その後、マップされた差異はtranslate()に移り、あなたのシーンは大きな精度でマウスに追従します。例えば

:デニスによって与えられた

QPointF tmp2 = mapToScene(event->pos()); 
QPointF tmp = tmp2.mapToScene(previous_point); 
translate(tmp.x(),tmp.y()); 
1

回答は仕事に変換取得する正しいです。 PF4Publicによるコメントも有効です。これはスケーリングを台無しにする可能性があります。 P4FPublcのとは異なっている私の回避策 - 代わりmapToSceneの私はアンカーを維持し、翻訳後にそれを復元:

previousAnchor = view.transformationAnchor() 
#have to set this for self.translate() to work. 
view.setTransformationAnchor(QGraphicsView.NoAnchor) 
view.translate(x_diff,y_diff) 
#have to reset the anchor or scaling (zoom) stops working: 
view.setTransformationAnchor(previousAnchor)