专栏首页sktjpython pyqt5 捕获鼠标键盘事件

python pyqt5 捕获鼠标键盘事件

image.png

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") QTimer.singleShot(0, 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("Thre&e")
        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_()

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python pyqt5 QScollBar

    import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.Qt...

    用户5760343
  • python pyqt5 按钮 QPushButton

    QAbstractButton/QPushButton,QToolButton,QRadioButton,QCheckBox 按钮状态: isDown() ...

    用户5760343
  • python pyqt5 窗体动画效果

    import sys from PyQt5.QtWidgets import QApplication, QWidget from PyQt5.QtGui ...

    用户5760343
  • 7.wxPython制作一个桌面精灵

    今天我们通过窗体的SetShape()函数来制作一个桌面精灵。我们制作的桌面精灵本质上还是一个窗体,只不过是一个特殊格式的窗体。我们创建一个style=wx.F...

    用户4381798
  • ReactiveCocoa,最受欢迎的iOS函数响应式编程库(2.5版),没有之一!

    简介 项目主页: ReactiveCocoa 实例下载: https://github.com/ios122/ios122 简评: 最受欢迎,最有价值的iOS响...

    ios122
  • 小蛇学python(2)两百行代码实现旅游中国34座大城市最短路径

    直接说基础语法,也许大家不会感兴趣。前言之后的这一章,给大家介绍一下我最近写出来的一个小功能。用python语言实现GA算法来解决TSP问题,希望以此来激发大家...

    用户2145057
  • 【项目实践】中英文文字检测与识别项目(CTPN+CRNN+CTC Loss原理讲解)

    文字识别也是图像领域一个常见问题。然而,对于自然场景图像,首先要定位图像中的文字位置,然后才能进行文字的识别。

    OpenCV学堂
  • PyQt5 字体/颜色/打印/打印预览对话框

    用户6021899
  • Python GUI项目实战(一)登录窗体的设计与实现

    前面我们学习了Python GUI 图型化界面Tkinter的基础知识,为了检测我们的学习成果,学以致用。我们从今天开始做一个综合Tkinter案例--基于Tk...

    小雨编程
  • python自学成才之路 类详细用法

    python是一门面向对象编程的语言,python的类和java中的类思想上有很多一样的地方,比如python类也是通过class修饰,里面也有成员属性,成员方...

    我是李超人

扫码关注云+社区

领取腾讯云代金券