如何让多个QGraphicsView在任何一个动作执行动作时拖动/移动图像

时间:2014-09-24 20:36:57

标签: python qt pyqt pyqt4

我正在创建一个界面来比较将要进行某些处理的图像。具体而言,第一个是彩色图像,第二个是灰度,第三个是应用了边缘滤波器,可能还有更多。能够在这些图像中的任何一个中进行缩放和拖动并让其他人以相同的方式进行比较它们会很好。

现在我有三对QGraphicsScene和QGraphicsView,每一个都包含适当图像,颜色或灰度等的QPixmap。我设法通过将事件过滤器附加到所有QGraphicsView并捕获鼠标滚轮滚动事件并将其分发给所有其他人。然而,这并不像图像拖动那么容易,因为它由多个事件组成。

感觉非常“混乱”,我想知道是否有更好的方法来实现这一目标。这是我目前拥有的事件过滤器的代码,它不适用于拖动:

def eventFilter(self, obj, event):
    if obj == self.viewA.viewport() or obj == self.viewB.viewport() or obj == self.viewC.viewport():
        if event.type() == QtCore.QEvent.Wheel:
            # This function passes the event to all the QGraphicsView's
            self.wheelEvent(event)
            return True
        elif event.type() == QtCore.QEvent.MouseMove:
            # This doesn't work but just to give an idea of what I'm trying to achieve
            self.viewA.mouseMoveEvent(event)
            self.viewB.mouseMoveEvent(event)
            self.viewC.mouseMoveEvent(event)

            return True

    return False

1 个答案:

答案 0 :(得分:0)

我认为您的问题源于QGraphicsViews对mouseMoveEvent不执行任何操作,除非鼠标单击它们。 (即,单击,拖动,然后释放,而不仅仅是将鼠标移到视图上)。

我建议在eventFilter中处理相应的单击和释放事件以及mouseMoveEvent。您需要使用bool来判断是否发生了您关心的拖拽。

一种可能的替代方案,我不确定这个是否可行,是不是使用mouseMoveEvent,而是可能需要使用dragMoveEvent。