PyQt——键盘事件和鼠标事件

2023-05-16

PyQt为事件处理提供了两种机制:高级的信号和槽机制,以及低级的事件处理程序。
PyQt为拦截和处理事件提供了5种不同的方式,这里只介绍最常用的头两种方式。
第一种是重新实现特定事件,如键盘和鼠标事件、重绘事件、尺寸大小改变事件等等,的处理程序。可参见代码示例。

第二种重新实现event()事件处理程序 。因为在任何特殊的事件处理程序被调用前,都会调用event()。重新实现这个方法,可以允许我们处理那些不能在某一特定事件处理程序(如对Tab键焦点转换行为的重新定义)中处理的事件,或者实现那些不存在明确事件处理程序的事件,比如QEvent.ToolBarChange。当需要重新实现这些处理程序时,可以对所有其它不是自己亲自处理的事件调用它们的基类的实现。

import sys
from PyQt5.QtWidgets import QMainWindow, QWidget, QApplication
from PyQt5.QtCore import Qt


class MainWindow(QMainWindow):

    def __init__(self, parent=None):
        super().__init__(parent)
        self.initUI()

    def initUI(self):
        self.setWindowTitle("鼠标键盘事件示例")
        self.setCentralWidget(QWidget())  # 指定主窗口中心部件
        self.statusBar().showMessage("ready")  # 状态栏显示信息
        self.resize(300, 185)

    # 重新实现各事件处理程序
    def keyPressEvent(self, event):
        key = event.key()
        if Qt.Key_A <= key <= Qt.Key_Z:
            if event.modifiers() & Qt.ShiftModifier:  # Shift 键被按下
                self.statusBar().showMessage('"Shift+%s" pressed' % chr(key), 500)
            elif event.modifiers() & Qt.ControlModifier:  # Ctrl 键被按下
                self.statusBar().showMessage('"Control+%s" pressed' % chr(key), 500)
            elif event.modifiers() & Qt.AltModifier:  # Alt 键被按下
                self.statusBar().showMessage('"Alt+%s" pressed' % chr(key), 500)
            else:
                self.statusBar().showMessage('"%s" pressed' % chr(key), 500)

        elif key == Qt.Key_Home:
            self.statusBar().showMessage('"Home" pressed', 500)
        elif key == Qt.Key_End:
            self.statusBar().showMessage('"End" pressed', 500)
        elif key == Qt.Key_PageUp:
            self.statusBar().showMessage('"PageUp" pressed', 500)
        elif key == Qt.Key_PageDown:
            self.statusBar().showMessage('"PageDown" pressed', 500)
        else:  # 其它未设定的情况
            QWidget.keyPressEvent(self, event)  # 留给基类处理
        '''
        其它常用按键:
        Qt.Key_Escape,Qt.Key_Tab,Qt.Key_Backspace,Qt.Key_Return,Qt.Key_Enter,
        Qt.Key_Insert,Qt.Key_Delete,Qt.Key_Pause,Qt.Key_Print,Qt.Key_F1...Qt.Key_F12,
        Qt.Key_Space,Qt.Key_0...Qt.Key_9,Qt.Key_Colon,Qt.Key_Semicolon,Qt.Key_Equal
        ...
        '''

    def mousePressEvent(self, event):  # 鼠标按下事件
        pos = event.pos()  # 返回鼠标所在点QPoint
        self.statusBar().showMessage('Mouse is pressed at (%d,%d) of widget ' % (pos.x(), pos.y()), 500)
        globalPos = self.mapToGlobal(pos)
        print('Mouse is pressed at (%d,%d) of screen ' % (globalPos.x(), globalPos.y()))

    def mouseReleaseEvent(self, event):  # 鼠标释放事件
        pos = event.pos()  # 返回鼠标所在点QPoint
        self.statusBar().showMessage('Mouse is released at (%d,%d) of widget ' % (pos.x(), pos.y()), 500)
        if event.button() == Qt.LeftButton:
            print("左键")
        elif event.button() == Qt.MidButton:
            print("中键")
        elif event.button() == Qt.RightButton:
            print("右键")

    def mouseDoubleClickEvent(self, event):  # 鼠标双击事件
        pos = event.pos()  # 返回鼠标所在点QPoint
        self.statusBar().showMessage('Mouse is double-clicked at (%d,%d) of widget ' % (pos.x(), pos.y()), 500)

    def mouseMoveEvent(self, event):  # 鼠标移动事件
        pos = event.pos()  # 返回鼠标所在点QPoint
        self.statusBar().showMessage('Mouse is moving at (%d,%d) of widget ' % (pos.x(), pos.y()), 500)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    mw = MainWindow()
    mw.show()
    sys.exit(app.exec_())
 键盘事件被频繁处理。例如,按下F1,显示帮助信息;在文本编辑框中,按下回车键,输入焦点自动跳到另一控件。下面详细介绍键盘事件。
1.设置输入焦点
在某一时刻,只有一个控件(或根本没有)可以获得输入焦点。指定输入焦点可使用QWidget的下列方法:

setFocus([reason]) - 如果控件在活动窗口中,调用此方法后,该控件成为输入焦点。reason参数可为QtCore.Qt类中的以下枚举变量:
    MouseFocusReason(0):使用鼠标获得焦点;
    TabFocusReason(1):按下了键;
    BacktabFocusReason(2):按下了+组合键;
    ActiveWindowFocusReason(3):窗口变为活动和非活动;
    PopupFocusReason(4):打开或关闭弹出窗口;
    ShortcutFocusReason(5):按下快捷键;
    MenuBarFocusReason(6):通过菜单操作;
    OtherFocusReaaon(7):其他方式。
clearFocus() - 去除输入焦点;
hasFocus() - 如果控件是输入焦点,返回True;否则,返回False;
focusWidget() - 返回最后调用setFocus()方法的控件对象;
setFocusProxy() - 指定获得输入焦点的控件对象;
focusProxy() - 返回获得非当前控件的输入焦点的控件对象;
focusNextChild() - 找到下一个可获得输入焦点的控件对象,并设置为输入焦点。相当于按了键。如果有此控件,返回True;否则,返回False;
focusPreviousChild() - 找到上一个可获得输入焦点的控件对象,并设置为输入焦点。相当于按了+键。如果有此控件,返回True;否则,返回False;
focusNextPrevChild() -  如果isnext参数为True,功能相当于focusNextChild();如果isnext参数为False,功能相当于focusPreviousChild();
setTabOrder(,) - 静态函数。用于指定按下键时,输入焦点的移动顺序。component2是当输入焦点在component1是按下键后的输入焦点所在的控件。如果有多个控件,则需要调用多次。例如,指定输入焦点在按下键的变化顺序为widget1->widget2->widget3->widget4,相应的代码为:
QtWidgets.QWidget.setTabOrder(widget1,widget2)
QtWidgets.QWidget.setTabOrder(widget2,widget3)
QtWidgets.QWidget.setTabOrder(widget3,widget4)
setFocusPolicy () - 指定控件如何获得输入焦点。Method可以QtCore.Qt类以一的枚举对象:
    nofocus(0):不能获得输入焦点;
    TabFocus(1):用键获得;
    ClickFocus(2):用点击鼠标获得;
    strongFocus(11):用键和点击鼠标获得;
    wheelFocus(15):用键、点击鼠标和滚轮获得;
focusPolicy():返回当前获得输入焦点的方式;
grabKeyboard():限定键盘输入。在调用releaseKeyboard()之前,其他控件无法获得输入焦点;
releaseKeyboard():释放之前所作的键盘输入限定。 

QApplication类的静态方法focusWidget()返回拥有键盘输入焦点的应用程序顶级窗口。如果还有,返回None.
QWidget类的下列方法可用来处理焦点事件:

focusInEvent(self, event) - 获得焦点时被调用;
focusOutEvent(self,even) - 失去焦点时被调用;

event参数为QFocusEvent类的实例,有以下方法:

gotFocus() - 如果event的类型为QEvent.FocusIn,返回True,否则,返回False;
lostFocus() - 如果event的类型为QEvent.FocusOut,返回True,否则,返回False;
reason() - 返回设置输入焦点的原因。
判断鼠标点击事件——左键按下、中键按下、右键按下、左右键同时按下
from PyQt5 import QtCore, QtGui, QtWidgets, QtMultimedia
 
 
class myLabel (QtWidgets.QLabel):  # 自定义的QLabel类
 
    def __init__(self, parent=None):
        super (myLabel, self).__init__ (parent)
 
    def mousePressEvent(self, e):  ##重载一下鼠标点击事件
        # 左键按下
        if e.buttons () == QtCore.Qt.LeftButton:
            self.setText ("左")
        # 右键按下
        elif e.buttons () == QtCore.Qt.RightButton:
            self.setText ("右")
        # 中键按下
        elif e.buttons () == QtCore.Qt.MidButton:
            self.setText ("中")
        # 左右键同时按下
        elif e.buttons () == QtCore.Qt.LeftButton | QtCore.Qt.RightButton:
            self.setText ("左右")
        # 左中键同时按下
        elif e.buttons () == QtCore.Qt.LeftButton | QtCore.Qt.MidButton:
            self.setText ("左中")
        # 右中键同时按下
        elif e.buttons () == QtCore.Qt.MidButton | QtCore.Qt.RightButton:
            self.setText ("右中")
        # 左中右键同时按下
        elif e.buttons () == QtCore.Qt.LeftButton | QtCore.Qt.MidButton | QtCore.Qt.RightButton:
            self.setText ("左中右")
 
 
class MyWindow (QtWidgets.QWidget):
    def __init__(self):
        super (MyWindow, self).__init__ ()
        self.label = myLabel ("点我")
        self.gridLayout = QtWidgets.QGridLayout (self)
        self.gridLayout.addWidget (self.label, 0, 0, 1, 1)
 
 
if __name__ == "__main__":
    import sys
 
    app = QtWidgets.QApplication (sys.argv)
    myshow = MyWindow ()
    myshow.show ()
    sys.exit (app.exec_ ())
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PyQt——键盘事件和鼠标事件 的相关文章

  • 如何使用表单上的按钮向 QTabWidget 添加选项卡?

    我决定为我的脚本编写视觉形式 这个想法是有一个按钮可以将新选项卡添加到 QTabWidget 它不起作用 我找不到一个好的例子 我使用PyQt5 这是我尝试过的一部分 import sys from PyQt5 QtGui import Q
  • 应该避免通配符导入吗?

    我正在使用 PyQt 并且遇到了这个问题 如果我的导入语句是 from PyQt4 QtCore import from PyQt4 QtGui import 然后 pylint 会给出数百个 未使用的导入 警告 我犹豫是否要关闭它们 因为
  • Qt 自定义动画按钮

    我正在尝试创建自定义动画按钮 我找到了这个页面 按钮示例 https tympanus net Development ButtonHoverStyles 我喜欢这个网站上的 3 和 19 我试过做3个 但不一样 有人能帮我吗 我的网站上第
  • 我的 QFileSystemModel 在 PyQt 中无法按预期工作

    EDIT2 model hasChildren parentIndex 回报True but model rowCount parentIndex 回报0 QFileSystemModel 只是 PyQt 中的 fubar 吗 EDIT 经
  • 如何获取对话框/窗口的背景颜色?

    如何获取 RGB 格式的对话框 窗口的背景颜色 Use QWidget palette访问小部件的调色板和QPalette color获取背景颜色 color widget palette color QPalette Background
  • 从线程接收数据后pyqt主窗口不断崩溃

    我有一个 QMainWindow 启动 QThread 并等待来自网络的数据 当收到任何数据时更新 UI 问题是 它有时会崩溃 有时不会 我所做的就是启动它并等待数据 这是线程类 class ListenerThread QtCore QT
  • 如何为列表中的每个元素创建一个按钮并将其放在滚动区域中?

    我有一个列表 每次用户打开文件时都会获取一个元素 我需要创建一个带有文件名 列表中的元素 的按钮 每次将该文件附加到列表中时 并将该按钮放入滚动区域 问题是我总是只有一个按钮 只是更改了名称 filenames def addfiles f
  • 如何在 PyQt 中使用 QThreads 双向设置信号和槽?

    这是基于 ekhumoro 答案的后续问题here https stackoverflow com a 52005755 4464653 and here https stackoverflow com a 20818401 4464653
  • 多级QTreeView

    我很难理解如何使用 QTreeView 和 QStandardItemModel 设置多级 QTree 这是我所拥有的 from PySide QtGui import import sys class MainFrame QWidget
  • pyqt5调用url时处于无响应状态

    我刚刚在 pyqt 中实现了登录 但在调用 url 和获取响应之间 qt 窗口显示无响应状态 谁能建议我如何避免不响应状态 code class Login QDialog def init self height width parent
  • 使用 PyQt5 拖放 QLabels

    我正在尝试使用 PyQt5 将 Qlabel 拖放到另一个 Qlabel 上 from PyQt5 QtWidgets import QApplication QWidget QToolTip QPushButton QMessageBox
  • PyQt - 如何检查 QDialog 是否可见?

    我有个问题 我有这个代码 balls Ball for i in range 1 10 因此 当我说 Ball 时 这将在 QDialog 上绘制一个球 然后当这完成后 我正在移动球QDialog无限循环中 我想说类似的话while QDi
  • QTableView 中的虚拟列?

    我开始学习 Qt4 模型 视图编程 我有初学者问题 我有一个简单的应用程序 其中显示 sqlite 表QTableView class Model QtSql QSqlTableModel def init self parent None
  • 从 Qthread 更新 Python GUI 元素

    所以我知道有很多关于使用 Qthread 更新 GUI 中的元素的帖子 我尽了最大努力去检查这些 但仍然有一个问题 我正在尝试创建一个 GUI 该 GUI 在单击按钮时运行一个方法 然后该方法启动一个新线程 然后该线程向 GUI 发出信号以
  • 如何编辑 QProgressBar 的样式表

    我无法在我的应用程序中编辑进度条的颜色 仅编辑文本颜色 pyhton 3 9 PySide6 QT Creator 7 0 2 Python应用程序 https i stack imgur com 6hKFI png import sys
  • 如何在 QTableView 标题中单击鼠标右键单击上下文菜单?

    下面的示例代码 很大程度上受到here http www saltycrane com blog 2007 12 pyqt 43 qtableview qabstracttablemodel 有一个右键单击上下文菜单 当用户单击表中的单元格
  • 如何检测QTableView中的双击

    我正在使用 PyQt 创建 GUI 应用程序 在继承自 QTableView 的视图中 需要检测用户双击行时选择的行 该表可以排序 但不能编辑 我该怎么做 注意 尝试了 doubleClicked int 信号 它是由鼠标按钮发出的 而不是
  • 使用 PyQt 和 matplotlib 在可滚动小部件中显示多个绘图

    由于我没有得到答案this https stackoverflow com questions 12179893 creating a scrollable multiplot with pythons pylab我尝试用 PyQt 解决这
  • 替换主窗口中的 CentralWidget

    我对 PySide 有点陌生 我有一个主窗口对象 一次显示一个小部件 我一直在尝试更改中央小部件QMainWindow类 以便在按下按钮时替换窗口中可见的小部件 问题是按下的按钮是在 Widget 类中 而不是在主窗口类中 say clas
  • 如何从 QLineEdit 动态获取文本? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 怎样才能得到String Text from QlineEdit 我尝试过像这样 myArea getList 功能是获取字符串值并使用字符

随机推荐

  • ubuntu的命令&操作

    记录ubuntu系统使用中一些常用的操作 1 在ubuntu终端打开图像界面的文件夹 xff1a cd到指定的目录之后执行nautilus即可 参考 xff1a linux系统ubuntu中在命令行如何打开图形界面的文件夹 李照耀 博客园
  • Leetcode解题目录(Python版)

    Leetcode解题目录 xff08 Python版 xff09 题目目录1 排序算法2 哈希表3 动态规划 题目来源于LeetCode官网题库 xff0c 解题思路参考官网各大佬 xff0c 这里做一个目录方便大家查找 xff0c 另外方
  • error while loading shared libraries: libopencv_imgcorecs.so.3.4:: cannot open shared object file:

    ubuntu16 04的环境下 xff0c 编译成功C 43 43 代码 xff0c 同时也安装好了opencv3 4 在运行时却出现error xff1a error while loading shared libraries libo
  • 基于LQR的车辆LKA算法设计

    记录分享一下基于LQR控制算法的车辆LKA设计 通过carsim和simulink进行联合仿真 1控制算法设计 整体思路是通过车辆以及道路模型 得到控制器的输入 v 纵向速度 r 横摆角速度 y 侧向路径偏移 phi 横摆角误差 通过最优控
  • 软件框架

    1 概念 框架 xff08 framework xff09 是一个框子 指其约束性 xff0c 也是一个架子 指其支撑性 是一个基本概念上的结构 xff0c 用于去解决或者处理复杂的问题 框架这个广泛的定义使用的十分流行 xff0c 尤其在
  • 使用C++开发STM32 FreeRTOS工程与添加DSP库

    续上一篇文章的内容 由CubeMX构建的Makefile工程只支持C和汇编的编译 xff0c 而且FreeRTOS的代码也需要作为C代码编译 当我们想使用C 43 43 时 xff0c 需要做一些准备并且修改Makefile xff1b 另
  • CPU分时、中断和上下文切换

    准备知识 xff1a 实时和分时 嵌入式操作系统可以分为实时操作系统和分时操作系统两类 我们现实之中使用的绝大多数是分时操作系统 xff0c 比如windows或者linux 但是比如汽车就必须使用实时操作系统 xff0c 举一个经常使用的
  • 如何从AD导出PDF原理图

    https jingyan baidu com article 7c6fb428d4759080642c9017 html
  • PyQt ——setStyleSheet用法

    这个是CSS的手册 xff0c 所有的东西都可以参考这里 xff1a https css doyoe com 下面是CSS 的东西 字体属性 xff1a font 大小 font size x large 特大 xx small 极小 一般
  • QMessageBox

    span class token triple quoted string string 39 39 39 简介 PyQt5中 QMessage 例子 39 39 39 span span class token keyword impor
  • QInputDialog

    span class token triple quoted string string 39 39 39 简介 PyQt5中 QInputDialog 例子 39 39 39 span span class token keyword i
  • python cherry 用法

    CheeryPy是一个 Pythonic 的 面向对象的 Web 框架 xff0c 能够用于接受POST或者GET请求并进行回复 CheeryPy中文文档 xff1a Cherrypy 一个极简的python web框架 CherryPy
  • PyQt——简单进度条程序

    span class token keyword from span PyQt5 span class token punctuation span QtCore span class token keyword import span Q
  • PyQt——窗口居中

    span class token comment coding utf 8 span span class token keyword import span sys span class token keyword from span P
  • PyQt——分离UI主线程与工作线程

    span class token comment coding utf 8 span span class token keyword import span sys span class token keyword from span P
  • PyQt——信号与槽简介

    信号与槽简介 定义信号 操作信号
  • PyQt——信号与槽基础应用

    信号与槽有三种使用方法 xff0c 第一种是内置信号与槽的使用 xff0c 第二种是自定义信 号与槽的使用 xff0c 第三是装饰器的信号与槽的使用 由于第三种方法本质上是第一 种方法的衍生 内置信号与槽的使用 所谓内置信号与槽的使用 xf
  • PyQt——信号与槽函数快速进阶

    内置信号与槽函数 span class token keyword from span PyQt5 span class token punctuation span QtWidgets span class token keyword i
  • PyQt——自定义信号与槽的高级应用

    高级自定义信号与槽 span class token keyword from span PyQt5 span class token punctuation span QtCore span class token keyword imp
  • PyQt——键盘事件和鼠标事件

    PyQt为事件处理提供了两种机制 xff1a 高级的信号和槽机制 xff0c 以及低级的事件处理程序 PyQt为拦截和处理事件提供了5种不同的方式 xff0c 这里只介绍最常用的头两种方式 第一种是重新实现特定事件 xff0c 如键盘和鼠标