我怎么知道鼠标是否在小部件上?

Phi*_*hil 7 c++ qt pyqt qwidget pyside

我是Qt(PyQt - PySide)的新手.
我正在尝试构建一个自定义小部件,这是一个菜单.然而,我走上了艰难的道路,似乎无法将自己排除在外.我已经阅读了文档,但我认为没有鼠标状态我可以验证以确定鼠标光标是否在给定的小部件上.

我呼吁函数mouseReleaseEventQWidget.

例:

def mouseReleaseEvent(self, e):     
Run Code Online (Sandbox Code Playgroud)

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

    if mouseCursorOverSelf == True:
        # do something ..
Run Code Online (Sandbox Code Playgroud)

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

非常感谢你!

小智 14

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

#!/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_())
Run Code Online (Sandbox Code Playgroud)

如果您只想检查鼠标是否在窗口小部件上,您可以使用以下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_())
Run Code Online (Sandbox Code Playgroud)

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

#!/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_())
Run Code Online (Sandbox Code Playgroud)

  • 嗨@ X.Jacobs.这非常令人兴奋!你的解决方案比我可怜的黑客更加优雅.;-) 优秀!你摇滚!我非常感谢你的帮助. (2认同)

Dav*_*nan 6

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