2010-09-01 41 views
2

我有一个QGraphicsView。为此,我添加了一个QGraphicsScene,并添加了一个QPixmap(* .jpeg)和QGraphicsEllipseItem(一个圆)。 QPixmap比QGraphicsView大得多,所以可以滚动。问题是QPixmap和QGraphicsEllipseItem都在移动。但是我想为QGraphicsView中的QGraphicsEllipseItem定位。它应该始终位于QGraphicsView的中心。 我该怎么做?希望有人能帮忙。Pyqt:如何在滚动可能的情况下将项目始终放置在QGraphicsView的中心?

回答

1

为滚动条的滚动信号添加信号处理程序(使用QAbstractSlider::sliderMoved())。

然后,您可以查看视图的左/上偏移量和大小,并相应地定位圆。请参阅QAbstractScrollArea的说明以帮助您入门。

+0

我试过了,但是我没有收到任何信号。但我仍然会尝试。 谢谢。 – user427305 2010-09-02 18:17:08

+0

好吧,它适用于graphicsView.viewport()。installEventFilter(self)和graphicsView.setViewportUpdateMode(0)。现在可以捕捉mouseMove事件。这不是最好的方式,但它的工作原理。 – user427305 2010-09-03 03:13:21

+0

我不会抓住鼠标移动。总之,如果您以后需要移动视图程序,该怎么办?将不会有一个mouseMove赶上。更好地绑定到滚动条信号。 – 2010-09-06 10:20:31

1

如果子类为QGraphicsView,则可以覆盖scrollContentsBy方法,以在滚动区域更改时设置椭圆的位置。这里有一些非常小的代码:

import sys 
from PyQt4 import QtGui 

class MyView(QtGui.QGraphicsView): 
    def __init__(self, scene, parent = None): 
     super(MyView, self).__init__(parent) 
     self.scene = scene 
     self.setScene(scene) 
     self.ellipse = QtGui.QGraphicsEllipseItem(0, 0, 30, 30, scene = self.scene) 
     self.scene.addItem(self.ellipse) 

    def scrollContentsBy(self, x, y): 
     super(MyView, self).scrollContentsBy(x, y) 
     self.ellipse.setPos(self.mapToScene(28, 28)) 

class MainWindow(QtGui.QMainWindow): 
    def __init__(self, parent = None): 
     super(MainWindow, self).__init__(parent) 
     pixmap = QtGui.QPixmap() 
     pixmap.load('imagefile.jpg') 
     scene = QtGui.QGraphicsScene(self) 
     scene.setSceneRect(0, 0, pixmap.width(), pixmap.height()) 
     item = QtGui.QGraphicsPixmapItem(pixmap) 
     scene.addItem(item) 
     self.view = MyView(scene, self) 
     self.view.setMinimumSize(100, 100) 

def main(): 
    app = QtGui.QApplication(sys.argv) 
    mainWindow = MainWindow() 
    mainWindow.show() 
    app.exec_() 

if __name__ == '__main__': 
    main() 
相关问题