9

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

我在 a 上调​​用一个mouseReleaseEvent函数QWidget

前任。:

def mouseReleaseEvent(self, e):     

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

    if mouseCursorOverSelf == True:
        # do something ..

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

非常感谢你!

4

2 回答 2

17

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

#!/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_())

如果您只想检查鼠标是否在小部件上,您可以使用该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_())
于 2012-12-30T15:51:43.913 回答
8

underMouse() 应该用来确定你的鼠标是否在一个小部件上。
Usage: widget.underMouse()
http://pyqt.sourceforge.net/Docs/PyQt4/qwidget.html#underMouse

于 2016-04-26T04:39:43.260 回答