python3+PyQt5重新实现QT事件处理程序


Posted in Python onApril 19, 2018

本文是对《Python Qt GUI快速编程》的第10章的例子events用Python3+PyQt5进行改写,涉及到重新实现QWidget的事件处理程序。本例子涉及到上下文菜单,鼠标事件,键盘事件,可作为重新实现事件处理程序的参考。

注:在创建上下文菜单最简单的方式使用Qwidget.addAction()把动作添加到窗口部件中,再把窗口部件的上下文菜单策略设置为Qt.ActionsContextMenu即可,但是如果像本例子一样要根据不同的状态来提供不同的选项,则要重新实现上下文菜单事件处理程序。

#!/usr/bin/env python3
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) # Avoids first resize msg


  def giveHelp(self):
    self.text = "Click to toggle mouse tracking"
    self.update()


  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\nYou pressed: {0}".format(self.key)
    painter = QPainter(self)
    painter.setRenderHint(QPainter.TextAntialiasing)
    painter.drawText(self.rect(), Qt.AlignCenter, text)
    if self.message:
      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 = "Resized to 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 = "Mouse tracking is on.\n"+\
            "Try moving the mouse!\n"+\
            "Single click to switch it off"
      else:
        self.text = "Mouse tracking is off.\n"+\
                      "Single click to switch it on"
      self.update()


  def mouseMoveEvent(self, event):
    if not self.justDoubleClicked:
      globalPos = self.mapToGlobal(event.pos())
      self.text = "The mouse is at\nQPoint({0}, {1}) "+\
          "in widget coords, and\n"+\
          "QPoint({2}, {3}) in screen coords".format(
          event.pos().x(), event.pos().y(), globalPos.x(),
          globalPos.y())
      self.update()


  def mouseDoubleClickEvent(self, event):
    self.justDoubleClicked = True
    self.text = "Double-clicked."
    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)


  def event(self, event):
    if (event.type() == QEvent.KeyPress and
      event.key() == Qt.Key_Tab):
      self.key = "Tab captured in event()"
      self.update()
      return True
    return QWidget.event(self, event)

if __name__ == "__main__":
  app = QApplication(sys.argv)
  form = Widget()
  form.show()
  app.exec_()

运行结果:

python3+PyQt5重新实现QT事件处理程序

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python捕捉和模拟鼠标事件的方法
Jun 03 Python
python集合比较(交集,并集,差集)方法详解
Sep 13 Python
使用PyCharm创建Django项目及基本配置详解
Oct 24 Python
python3 面向对象__类的内置属性与方法的实例代码
Nov 09 Python
对Python的zip函数妙用,旋转矩阵详解
Dec 13 Python
python 自动批量打开网页的示例
Feb 21 Python
python django中8000端口被占用的解决
Dec 17 Python
将python依赖包打包成window下可执行文件bat方式
Dec 26 Python
详解PyQt5中textBrowser显示print语句输出的简单方法
Aug 07 Python
Python Map 函数的使用
Aug 28 Python
Python基础知识之变量的详解
Apr 14 Python
Python获取江苏疫情实时数据及爬虫分析
Aug 02 Python
python3+PyQt5重新实现自定义数据拖放处理
Apr 19 #Python
python之从文件读取数据到list的实例讲解
Apr 19 #Python
python实现读取大文件并逐行写入另外一个文件
Apr 19 #Python
python按行读取文件,去掉每行的换行符\n的实例
Apr 19 #Python
PyQt5每天必学之拖放事件
Aug 27 #Python
sublime python3 输入换行不结束的方法
Apr 19 #Python
PyQt5每天必学之像素图控件QPixmap
Apr 19 #Python
You might like
thinkphp的c方法使用示例
2014/02/24 PHP
推荐一款PHP+jQuery制作的列表分页的功能模块
2014/10/14 PHP
PHP IDE phpstorm 常用快捷键
2015/05/18 PHP
PHP中快速生成随机密码的几种方式
2017/04/17 PHP
PHP利用curl发送HTTP请求的实例代码
2020/07/09 PHP
jQuery 处理网页内容的实现代码
2010/02/15 Javascript
jquery根据锚点offset值实现动画切换
2014/09/11 Javascript
js单独获取一个checkbox看其是否被选中
2014/09/22 Javascript
javascript实现修改微信分享的标题内容等
2014/12/11 Javascript
JavaScript添加随滚动条滚动窗体的方法
2016/02/23 Javascript
BootStrap使用popover插件实现鼠标经过显示并保持显示框
2016/06/23 Javascript
文本框只能输入数字的实现方法(兼容IE火狐)
2016/06/25 Javascript
js动态添加的DIV中的onclick事件简单实例
2016/07/25 Javascript
详解VueJs异步动态加载块
2017/03/09 Javascript
微信小程序 下拉菜单简单实例
2017/04/13 Javascript
基于Vue开发数字输入框组件
2017/12/19 Javascript
基于node打包可执行文件工具_Pkg使用心得分享
2018/01/24 Javascript
使用proxy实现一个更优雅的vue【推荐】
2018/06/19 Javascript
微信小程序实现日历效果
2018/12/28 Javascript
js实现固定区域内的不重叠随机圆
2019/10/24 Javascript
vue+导航锚点联动-滚动监听和点击平滑滚动跳转实例
2019/11/13 Javascript
js实现九宫格布局效果
2020/05/28 Javascript
electron踩坑之remote of undefined的解决
2020/10/06 Javascript
详解Python中pyautogui库的最全使用方法
2020/04/01 Python
jupyter notebook指定启动目录的方法
2021/03/02 Python
前端面试必备之html5的新特性
2017/09/05 HTML / CSS
Emporio Armani腕表天猫官方旗舰店:乔治·阿玛尼为年轻人设计的副线品牌
2017/07/02 全球购物
华为C++笔试题
2014/08/05 面试题
大学四年的个人自我评价
2014/01/14 职场文书
老干部工作先进事迹
2014/08/17 职场文书
见义勇为事迹材料
2014/12/24 职场文书
邀请函模板
2015/02/02 职场文书
新学期主题班会
2015/08/17 职场文书
财务人员入职担保书
2015/09/22 职场文书
2019年公司快递收发管理制度模板
2019/11/20 职场文书
python 多态 协议 鸭子类型详解
2021/11/27 Python