【问题标题】:PyQt5 Event Filter Object DetectionPyQt5 事件过滤器对象检测
【发布时间】:2020-03-27 15:04:27
【问题描述】:

我想在单击QGraphicsView 小部件中的某个点时报告鼠标位置。

class App(QMainWindow, Ui_MainWindow):

    def __init__(self, parent=None):
        super(App, self).__init__(parent)
        self.setupUi(self)

        self.graphicsView.viewport().installEventFilter(self)
        self.graphicsView_2.viewport().installEventFilter(self)

    def eventFilter(self, a0: 'QObject', a1: 'QEvent') -> bool:
        if a0 == self.graphicsView:
            if a1.type() == QtCore.QEvent.MouseButtonPress:
                mousePosition = a1.pos()
                print(mousePosition.x(), 261 - mousePosition.y())
                return True
            return False
        elif a0 == self.graphicsView_2:
            if a1.type() == QtCore.QEvent.MouseButtonPress:
                mousePosition = a1.pos()
                print(mousePosition.x(), 261 - mousePosition.y())
                return True
            return False
        return False

我只希望它在我按下我列出的两个QGraphicsView 小部件之一时报告鼠标按钮。但是,使用此当前代码,任何时候都不会触发任何内容。我假设a0 永远不会等于我想与之比较的QGraphicsView 小部件,所以我不确定如何在需要时触发此触发器。

【问题讨论】:

    标签: python pyqt pyqt5 qgraphicsview


    【解决方案1】:

    QGraphicsView 继承自QAbstractScrollArea,因此您单击的小部件不是QGraphicsView,而是在其viewport() 中。这似乎可以理解,因为您在viewport() 中安装了事件过滤器,因此“a0”永远不会是QGraphicsView,而是viewport()。此外,当您比较对象时,最好使用“is”。

    综合以上,解决办法是:

    if a0 <b>is</b> self.graphicsView<b>.viewport()</b>:

    if a0 <b>is</b> self.graphicsView_2<b>.viewport()</b>:

    【讨论】:

    • 太好了,谢谢!这解决了我的问题。 a0 每次都是 QWidget,而不是预期的 QGraphicsView
    • @mtrns "a0" 只能是同一个对象或安装过滤器的 QObjects,在您的情况下是 viewport(),事件过滤器不知道它是 QGraphicsView 还是 QPushButton或 QLineEdit。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 2015-07-21
    • 1970-01-01
    • 2018-12-14
    • 2018-08-05
    • 2012-04-02
    相关资源
    最近更新 更多