首页 文章

当光标在按钮上时,mouseMoveEvent()

提问于
浏览
-1

当光标移动时,我必须激活一些功能 . 所以,我在MainWidget中使用了 self.setMouseTracking(True) . 但是这样 mouseMoveEvent() 只有在光标下有一个空表格时才有效 . 我尝试在main上创建另一个小部件,但它根本不起作用 .

class ClickButton(QPushButton):
    def __init__(self, text, window):
        ...

    def run(self):
        ...

class Window(QWidget):
    def __init__(self):
        super().__init__() 
        self.setGeometry(0, 0, 1000, 1000)
        self.setMouseTracking(True)
        self.clickers = [ClickButton('OK', self) for i in range(8)]

    def mouseMoveEvent(self, ev):
        for e in self.clickers:
            e.run()

该怎么办?

1 回答

  • 0

    如果您想要检测鼠标的位置,即使鼠标位于孩子的顶部,可能的选择是使用事件过滤器 .

    from PyQt5 import QtCore, QtGui, QtWidgets
    
    class Widget(QtWidgets.QWidget):
        def __init__(self, parent=None):
            super(Widget, self).__init__(parent)
    
            w_ = QtWidgets.QWidget()
            lay_w = QtWidgets.QHBoxLayout(w_)
            for c in (QtWidgets.QPushButton(), QtWidgets.QLineEdit()):
                lay_w.addWidget(c)
    
            lay = QtWidgets.QVBoxLayout(self)
            for w in (QtWidgets.QPushButton(), QtWidgets.QLineEdit(), QtWidgets.QTextEdit(), w_):
                lay.addWidget(w)
    
            for ws in self.findChildren(QtWidgets.QWidget) + [self]:
                ws.setMouseTracking(True)
                ws.installEventFilter(self)
    
        def eventFilter(self, obj, event):
            if event.type() == QtCore.QEvent.MouseMove:
                p_respect_to_window = self.mapFromGlobal(obj.mapToGlobal(event.pos()))
                print(p_respect_to_window)
            return super(Widget, self).eventFilter(obj, event)
    
    
    if __name__ == '__main__':
        import sys
        app = QtWidgets.QApplication(sys.argv)
        w = Widget()
        w.show()
        sys.exit(app.exec_())
    

    另一方面,如果您只想在一种类型的自定义窗口小部件中执行此操作,则最好覆盖自定义窗口小部件的mouseMoveEvent方法:

    from PyQt5 import QtCore, QtGui, QtWidgets
    
    class ClickButton(QtWidgets.QPushButton):
        def __init__(self, text, parent=None):
            super(ClickButton, self).__init__(text=text, parent=parent)
            self.setMouseTracking(True)
    
        def mouseMoveEvent(self, event):
            self.run()
            super(ClickButton, self).mouseMoveEvent(event)
    
        def run(self):
            print("call to run function in button{} and time: {}".format(self.text(), 
                QtCore.QDateTime.currentDateTime().toString()))
    
    class Widget(QtWidgets.QWidget):
        def __init__(self, parent=None):
            super(Widget, self).__init__(parent)
    
            lay = QtWidgets.QVBoxLayout(self)
            for i in range(10):
                w = ClickButton(str(i), self)
                lay.addWidget(w)
    
    if __name__ == '__main__':
        import sys
        app = QtWidgets.QApplication(sys.argv)
        w = Widget()
        w.show()
        sys.exit(app.exec_())
    

相关问题