Python鼠标事件及坐标获取窗口和屏幕坐标

编辑: admin 分类: python 发布时间: 2021-12-03 来源:互联网
目录
  • 效果如下:
  • 分析:
    • 重写关闭事件
    • 重写上下文菜单事件
    • 重写自带的绘制事件 也就是自定义
    • 重新实现调整窗口大小事件
    • 重新实现鼠标的释放事件
    • 重新实现鼠标的移动事件
    • 重新实现鼠标双击事件
    • 重新实现键盘按下事件
  • 源码如下

    本文主要介绍重写自带的一些方法,拾取屏幕和窗口坐标信息

    效果如下:

    这里写图片描述

    分析:

    定时服务:在固定一段时间后执行相关的函数方法,例如这里表示的是在0秒后执行self.giveHelp这个方法

    QTimer.singleShot(0, self.giveHelp)

    重写关闭事件

        def giveHelp(self):
            self.text = "请点击这里触发追踪鼠标的功能"
            self.update()
    # self.update()表示的是刷新

    重写上下文菜单事件

    #这里的重写上下文菜单表示的是右键所显示的菜单
    def contextMenuEvent(self, event):
        menu = QMenu(self)
        oneAction = menu.addAction("&one")
        #这里表示的是右键后再选择出现时连接的信号和槽函数
        oneAction.triggered.connect(self.one)
        # 这里表示的是添加一行分割线
        menu.addSeparator()
        menu.exec_(event.globaPos)

    重写自带的绘制事件 也就是自定义

    def paintEvent(self, event):
        text = self.text
        i = text.find("\n\n")
        if i>=0:
            text = text[0:1]
        if self.key:这个表示的是如果触发了键盘事件那么这里就记录按钮事件的信息   
        text += "\n\n你按下了: {0}".format(self.key)
        painter = QPainter(self)
        painter.setRebderHint(QPainter.TextAntialiasing)
        painter.drawText(self.rect(), Qt.AlignCenter, text)#绘制文本信息

    重新实现调整窗口大小事件

    也就是说在界面窗口大小出现变化的时候回调用这个方法

    def resizeEvent(self,event):
        self.text = "调整窗口大小为: QSize({0},{1})".format(event.size().width(), event.size().height())
        self.update()

    重新实现鼠标的释放事件

    也就是说当鼠标双击完成或者是单击完成之后调用的方法

        def mouseReleaseEvent(self, event):

    重新实现鼠标的移动事件

    也就是说在鼠标移动的过程中就会调用这个方法

    def mouseMoveEvent(self, event):
            # 这里的意思就是将窗口的坐标转化为屏幕的坐标
            globalPos = self.mapTpGlobal(event.pos())
            self.text = """鼠标的位置为: 窗口坐标为: Qpoint({0},{1}),屏幕坐标为:屏幕坐标为:QPoint({2},{3})""".format(
            event.pos().x(),event.pos().y(), globalPos.x(), globalPos.y())
            )
            self.update()

    重新实现鼠标双击事件

        def mouseDoubleClickEvent(self, event):
            self.justDoubleClicked = True
            self.text = "你双击了鼠标"
            self.update()

    重新实现键盘按下事件

    def keyPressEvent(self, event):
        if event.key()==QT.Key_Home:
            self.key = "Home"

    源码如下

    import sys
    from PyQt5.QtCore import (QEvent, QTimer, Qt)
    from PyQt5.QtWidgets import (QApplication, QMenu, QWidget)
    from PyQt5.QtGui import QPainter
    class Widget(QWidget):
        def __init__(self, parent=None):
            super(Widget, self).__init__(parent)
            self.justDoubleClicked = False
            self.key = ""
            self.text = ""
            self.message = ""
            self.resize(400, 300)
            self.move(100, 100)
            self.setWindowTitle("Events")
            # 这里表示6秒钟后调用giveHelp这个方法
            QTimer.singleShot(6000, self.giveHelp)  # 避免窗口大小重绘事件的影响,可以把参数0改变成3000(3秒),然后在运行,就可以明白这行代码的意思。
        def giveHelp(self):
            self.text = "请点击这里触发追踪鼠标功能"
            self.update() # 重绘事件,也就是触发paintEvent函数。
        '''重新实现关闭事件'''
        def closeEvent(self, event):
            print("Closed")
    
        '''重新实现上下文菜单事件,也就是右键的菜单'''
        def contextMenuEvent(self, event):
            menu = QMenu(self)
            oneAction = menu.addAction("&One")
            twoAction = menu.addAction("&Two")
            oneAction.triggered.connect(self.one)
            twoAction.triggered.connect(self.two)
            if not self.message:
                menu.addSeparator()
                threeAction = menu.addAction("Three")
                threeAction.triggered.connect(self.three)
            menu.exec_(event.globalPos())
    
        '''上下文菜单槽函数'''
        def one(self):
            self.message = "Menu option One"
            self.update()
    
        def two(self):
            self.message = "Menu option Two"
            self.update()
    
        def three(self):
            self.message = "Menu option Three"
            self.update()
    
        '''重新实现绘制事件'''
        def paintEvent(self, event):
            text = self.text
            i = text.find("\n\n")
            if i >= 0:
                text = text[0:i]
            if self.key: # 若触发了键盘按钮,则在文本信息中记录这个按钮信息。
                text += "\n\n你按下了: {0}".format(self.key)
            painter = QPainter(self)
            painter.setRenderHint(QPainter.TextAntialiasing)
            painter.drawText(self.rect(), Qt.AlignCenter, text) # 绘制信息文本的内容
            if self.message: # 若消息文本存在则在底部居中绘制消息,5秒钟后清空消息文本并重绘。
                painter.drawText(self.rect(), Qt.AlignBottom | Qt.AlignHCenter,
                                 self.message)
                QTimer.singleShot(5000, self.clearMessage)
                QTimer.singleShot(5000, self.update)
    
        '''清空消息文本的槽函数'''
        def clearMessage(self):
            self.message = ""
    
        '''重新实现调整窗口大小事件'''
        def resizeEvent(self, event):
            self.text = "调整窗口大小为: QSize({0}, {1})".format(
                event.size().width(), event.size().height())
            self.update()
    
        '''重新实现鼠标释放事件'''
        def mouseReleaseEvent(self, event):
            # 若鼠标释放为双击释放,则不跟踪鼠标移动
            # 若鼠标释放为单击释放,则需要改变跟踪功能的状态,如果开启跟踪功能的话就跟踪,不开启跟踪功能就不跟踪
            if self.justDoubleClicked:
                self.justDoubleClicked = False
            else:
                self.setMouseTracking(not self.hasMouseTracking()) # 单击鼠标
                if self.hasMouseTracking():
                    self.text = "开启鼠标跟踪功能.\n" + \
                                "请移动一下鼠标!\n" + \
                                "单击鼠标可以关闭这个功能"
                else:
                    self.text = "关闭鼠标跟踪功能.\n" + \
                                "单击鼠标可以开启这个功能"
                self.update()
    
        '''重新实现鼠标移动事件'''
        def mouseMoveEvent(self, event):
            if not self.justDoubleClicked:
                globalPos = self.mapToGlobal(event.pos()) # 窗口坐标转换为屏幕坐标
                self.text = """鼠标位置:
                窗口坐标为:QPoint({0}, {1}) 
                屏幕坐标为:QPoint({2}, {3}) """.format(event.pos().x(), event.pos().y(), globalPos.x(), globalPos.y())
                self.update()
    
        '''重新实现鼠标双击事件'''
        def mouseDoubleClickEvent(self, event):
            self.justDoubleClicked = True
            self.text = "你双击了鼠标"
            self.update()
    
        '''重新实现键盘按下事件'''
        def keyPressEvent(self, event):
            self.key = ""
            if event.key() == Qt.Key_Home:
                self.key = "Home"
            elif event.key() == Qt.Key_End:
                self.key = "End"
            elif event.key() == Qt.Key_PageUp:
                if event.modifiers() & Qt.ControlModifier:
                    self.key = "Ctrl+PageUp"
                else:
                    self.key = "PageUp"
            elif event.key() == Qt.Key_PageDown:
                if event.modifiers() & Qt.ControlModifier:
                    self.key = "Ctrl+PageDown"
                else:
                    self.key = "PageDown"
            elif Qt.Key_A <= event.key() <= Qt.Key_Z:
                if event.modifiers() & Qt.ShiftModifier:
                    self.key = "Shift+"
                self.key += event.text()
            if self.key:
                self.key = self.key
                self.update()
            else:
                QWidget.keyPressEvent(self, event)
    
        '''重新实现其他事件,适用于PyQt没有提供该事件的处理函数的情况,Tab键由于涉及焦点切换,不会传递给keyPressEvent,因此,需要在这里重新定义。'''
        def event(self, event):
            if (event.type() == QEvent.KeyPress and
                        event.key() == Qt.Key_Tab):
                self.key = "在event()中捕获Tab键"
                self.update()
                return True
            return QWidget.event(self, event)
    if __name__ == "__main__":
        app = QApplication(sys.argv)
        form = Widget()
        form.show()
        app.exec_()

    以上就是Python鼠标事件及坐标获取窗口和屏幕坐标的详细内容,更多关于鼠标事件及坐标获取窗口和屏幕坐标的资料请关注hwidc其它相关文章!

    【原创作者:http://www.1234xp.com/jap.html 转载请说明出处】