【问题标题】:Pyqt: How-to set item always in the center of a QGraphicsView when scrolling is possible?Pyqt:当可以滚动时,如何将项目始终设置在 QGraphicsView 的中心?
【发布时间】:2011-04-06 20:42:07
【问题描述】:

我有一个 QGraphicsView。为此,我添加了 QGraphicsScene,并添加了 QPixmap(*.jpeg) 和 QGraphicsEllipseItem(a circle)。 QPixmap 比 QGraphicsView 大得多,因此启用了滚动。问题是 QPixmap 和 QGraphicsEllipseItem 都在移动。但我想要 QGraphicsView 中 QGraphicsEllipseItem 的固定位置。它应该始终位于 QGraphicsView 的中心。 我怎样才能做到这一点?希望有人可以提供帮助。

【问题讨论】:

    标签: pyqt qgraphicsview


    【解决方案1】:

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

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

    【讨论】:

    • 我试过了,但我没有收到任何信号。但我还是会试试的。谢谢。
    • 好的,它适用于 graphicsView.viewport().installEventFilter(self) 和 graphicsView.setViewportUpdateMode(0)。现在可以捕获 mouseMove 事件。这不是最好的方法,但它确实有效。
    • 我不会捕捉到鼠标移动。毕竟,如果您以后需要以编程方式移动视图怎么办?不会有 mouseMove 可以捕捉。最好绑定到滚动条信号。
    【解决方案2】:

    如果你继承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()
    

    【讨论】:

      猜你喜欢
      • 2014-11-12
      • 2018-02-25
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 2013-12-24
      • 2014-03-11
      • 1970-01-01
      • 2016-01-28
      相关资源
      最近更新 更多