【问题标题】:How can I know if the mouse is over the widget?我怎么知道鼠标是否在小部件上?
【发布时间】:2012-12-15 00:36:22
【问题描述】:

我对 Qt (PyQt - PySide) 还很陌生。
我正在尝试构建一个自定义小部件,它是一个菜单。然而,我已经走上了一条艰难的道路,我似乎无法理清自己的问题。我已阅读文档,但我认为没有鼠标状态可以验证以确定鼠标光标是否在给定的小部件上。

我在QWidgetmouseReleaseEvent 上调用一个函数。

例如:

def mouseReleaseEvent(self, e):     

触发此事件时,我必须知道鼠标实际上是在小部件上方还是在其外部(触发此事件的小部件)。

    if mouseCursorOverSelf == True:
        # do something ..

我怎样才能做到这一点?我需要做什么?

非常感谢!

【问题讨论】:

  • 您能否提供更多代码,最好提供一个完整的示例来显示您的问题?如果您覆盖小部件的事件方法,它们会为 this 小部件隐式调用,除非您抓住鼠标。
  • 你好安德烈亚斯。如果您单击一个小部件,请按住鼠标但将光标拖到远离 this 的另一个小部件上,当您释放鼠标时,仍会触发 mouseReleaseEvent。我需要在发布时知道光标是否在小部件上。我该怎么做?

标签: c++ qt pyqt pyside qwidget


【解决方案1】:

如果您想跟踪鼠标何时进入或离开小部件,您可以使用以下内容:

#!/usr/bin/env python
#-*- coding:utf-8 -*-

from PyQt4 import QtCore, QtGui

class mainwindow(QtGui.QWidget):
    def __init__(self, parent=None):
        super(mainwindow, self).__init__(parent)

    def enterEvent(self, event):
        print "Mouse Entered"
        return super(mainwindow, self).enterEvent(event)

    def leaveEvent(self, event):
        print "Mouse Left"
        return super(mainwindow, self).enterEvent(event)

if __name__ == "__main__":
    import sys

    app  = QtGui.QApplication(sys.argv)
    main = mainwindow()
    main.show()
    sys.exit(app.exec_())

如果只想检查鼠标是否在widget上,可以使用QWidget::underMouse ()函数:

#!/usr/bin/env python
#-*- coding:utf-8 -*-

from PyQt4 import QtCore, QtGui

class mainwindow(QtGui.QWidget):
    def __init__(self, parent=None):
        super(mainwindow, self).__init__(parent)

        self.button = QtGui.QPushButton("Check Mouse in 3 seconds")
        self.button.clicked.connect(self.on_button_clicked)

        self.layout = QtGui.QHBoxLayout(self)
        self.layout.addWidget(self.button)

    def mouseReleaseEvent(self, event):  
        if self.underMouse():
            print "Do something"

        return super(mainwindow, self).mouseReleaseEvent(event)

    @QtCore.pyqtSlot()
    def on_button_clicked(self):    
        QtCore.QTimer.singleShot(3000, self.checkMouse)

    def checkMouse(self):
        print "Under Mouse: {0}".format(self.underMouse())

if __name__ == "__main__":
    import sys

    app  = QtGui.QApplication(sys.argv)
    main = mainwindow()
    main.show()
    sys.exit(app.exec_())

另一种方法是检查鼠标的位置是否在小部件的内部几何图形内:

#!/usr/bin/env python
#-*- coding:utf-8 -*-

from PyQt4 import QtCore, QtGui

class mainwindow(QtGui.QWidget):
    def __init__(self, parent=None):
        super(mainwindow, self).__init__(parent)

        self.setMouseTracking(True)

    def mouseReleaseEvent(self, event):  
        posMouse =  event.pos()
        if self.rect().contains(posMouse):
            print "Under Mouse"

        return super(mainwindow, self).mouseReleaseEvent(event)

if __name__ == "__main__":
    import sys

    app  = QtGui.QApplication(sys.argv)
    main = mainwindow()
    main.show()
    main.resize(200, 200)
    sys.exit(app.exec_())

【讨论】:

  • 你好@X.Jacobs。非常感谢您的回答。由于拖动操作(鼠标按下时)在Mouse()方法下失败,它并没有完全解决我的问题。但是从您的帖子中得到启发并进行了更多研究,我实现了 mouseReleaseEvent 的条件。我所做的是,使用 event.pos() 获取相对鼠标位置,并根据小部件的宽度和高度检查其 .x() 和 .y() 值。如果位置在边界内,如果没有停止,我会继续进行。
  • @Phil Checkout my updated answer,我添加了另一个示例来检查鼠标位置
  • 嗨@X.Jacobs。这非常令人兴奋!你的解决方案比我可怜的黑客要优雅得多。 ;-) 优秀!你摇滚!我真的非常感谢您的所有帮助。
【解决方案2】:

underMouse() 用于确定您的鼠标是否位于小部件上。
Usage: widget.underMouse()
http://pyqt.sourceforge.net/Docs/PyQt4/qwidget.html#underMouse

【讨论】:

  • 也为我工作。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-21
  • 1970-01-01
  • 2011-04-03
  • 2021-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多