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实现基于权重的随机数2种方法
Apr 28 Python
Python实现递归遍历文件夹并删除文件
Apr 18 Python
Python输出汉字字库及将文字转换为图片的方法
Jun 04 Python
python实现redis三种cas事务操作
Dec 19 Python
pycharm远程linux开发和调试代码的方法
Jul 17 Python
Python网页正文转换语音文件的操作方法
Dec 09 Python
python 定时器,轮询定时器的实例
Feb 20 Python
实例详解Matlab 与 Python 的区别
Apr 26 Python
python爬虫添加请求头代码实例
Dec 28 Python
Python递归函数特点及原理解析
Mar 04 Python
django配置app中的静态文件步骤
Mar 27 Python
Python替换NumPy数组中大于某个值的所有元素实例
Jun 08 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
上海无线电三厂简史修改版
2021/03/01 无线电
php程序之die调试法 快速解决错误
2009/09/17 PHP
php与XML、XSLT、Mysql的结合运用实现代码
2009/11/19 PHP
php生成shtml类用法实例
2014/12/09 PHP
PHP实现C#山寨ArrayList的方法
2015/07/16 PHP
php设计模式之享元模式分析【星际争霸游戏案例】
2020/03/23 PHP
判断客户端浏览器是否安装了Flash插件的多种方法
2010/08/11 Javascript
jquery鼠标停止移动事件
2013/12/21 Javascript
ParseInt函数参数设置介绍
2014/01/02 Javascript
纯js写的分页表格数据为json串
2014/02/18 Javascript
js实现按钮加背景图片常用方法
2014/11/01 Javascript
javascript中对象的定义、使用以及对象和原型链操作小结
2016/12/14 Javascript
js实现消息滚动效果
2017/01/18 Javascript
javascript 中的try catch应用总结
2017/04/01 Javascript
5分钟打造简易高效的webpack常用配置
2017/07/04 Javascript
vue2中filter()的实现代码
2017/07/09 Javascript
vue按需引入element Transfer 穿梭框
2017/09/30 Javascript
webpack 4.0.0-beta.0版本新特性介绍
2018/02/10 Javascript
浅谈angular表单提交中ng-submit的默认使用方法
2018/09/30 Javascript
详解将微信小程序接口Promise化并使用async函数
2019/08/05 Javascript
CountUp.js实现数字滚动增值效果
2019/10/17 Javascript
[05:43]VG.R战队教练Mikasa专访:为目标从未停止战斗
2016/08/02 DOTA
Python实现大文件排序的方法
2015/07/10 Python
Python实现的排列组合计算操作示例
2017/10/13 Python
python实现微信发送邮件关闭电脑功能
2018/02/22 Python
利用python实现凯撒密码加解密功能
2020/03/31 Python
床上用品全球在线购物:BeddingInn
2016/12/18 全球购物
市场营销求职信范文
2014/02/21 职场文书
大队委竞选演讲稿
2014/04/28 职场文书
全国优秀辅导员事迹材料
2014/05/14 职场文书
支部鉴定材料
2014/06/02 职场文书
护林防火标语
2014/06/27 职场文书
公文格式,规则明细(新手收藏)
2019/07/23 职场文书
OpenCV3.3+Python3.6实现图片高斯模糊
2021/05/18 Python
Java8利用Stream对列表进行去除重复的方法详解
2022/04/14 Java/Android
MutationObserver在页面水印实现起到的作用详解
2022/07/07 Javascript