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实现颜色rgb和hex相互转换的函数
Mar 19 Python
Python中有趣在__call__函数
Jun 21 Python
Python 探针的实现原理
Apr 23 Python
python导出chrome书签到markdown文件的实例代码
Dec 27 Python
基于python 爬虫爬到含空格的url的处理方法
May 11 Python
Python实现App自动签到领取积分功能
Sep 29 Python
python对文件目录的操作方法实例总结
Jun 24 Python
利用Python检测URL状态
Jul 31 Python
利用python中集合的唯一性实现去重
Feb 11 Python
python3+opencv生成不规则黑白mask实例
Feb 19 Python
python爬虫泛滥的解决方法详解
Nov 25 Python
python+selenium小米商城红米K40手机自动抢购的示例代码
Mar 24 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
PHP+DBM的同学录程序(1)
2006/10/09 PHP
thinkphp实现多语言功能(语言包)
2014/03/04 PHP
php实现RSA加密类实例
2015/03/26 PHP
Zend Framework连接Mysql数据库实例分析
2016/03/19 PHP
Zend Framework教程之Zend_Form组件实现表单提交并显示错误提示的方法
2016/03/21 PHP
新浪的图片新闻效果
2007/01/13 Javascript
IE JS编程需注意的内存释放问题
2009/06/23 Javascript
jquery 日期分离成年月日的代码
2010/05/14 Javascript
Extjs中的GridPanel隐藏列会显示在menuDisabled中解决方法
2013/01/27 Javascript
Dojo Javascript 编程规范 规范自己的JavaScript书写
2014/10/26 Javascript
关于react中组件通信的几种方式详解
2017/12/10 Javascript
手写Node静态资源服务器的实现方法
2018/03/20 Javascript
JS实现全屏预览F11功能的示例代码
2018/07/23 Javascript
Vue实现美团app的影院推荐选座功能【推荐】
2018/08/29 Javascript
angularjs中判断ng-repeat是否迭代完的实例
2018/09/12 Javascript
js Array.slice的8种不同用法示例
2019/07/10 Javascript
基于vue写一个全局Message组件的实现
2019/08/15 Javascript
React+Redux实现简单的待办事项列表ToDoList
2019/09/29 Javascript
Python设计模式之中介模式简单示例
2018/01/09 Python
Python3 SSH远程连接服务器的方法示例
2018/12/29 Python
python UDP(udp)协议发送和接收的实例
2019/07/22 Python
Python如何使用队列方式实现多线程爬虫
2020/05/12 Python
Django --Xadmin 判断登录者身份实例
2020/07/03 Python
opencv 图像滤波(均值,方框,高斯,中值)
2020/07/08 Python
Selenium及python实现滚动操作多种方法
2020/07/21 Python
Python爬虫之Selenium实现关闭浏览器
2020/12/04 Python
CSS3实现大小不一的粒子旋转加载动画
2016/04/21 HTML / CSS
css3实现蒙版弹幕功能
2019/06/18 HTML / CSS
美国著名的户外用品品牌:L.L.Bean
2018/01/05 全球购物
shell程序中如何注释
2012/01/28 面试题
大学生求职信范文应怎么写
2014/01/01 职场文书
计划生育证明书写要求
2014/09/17 职场文书
给客户的感谢信
2015/01/21 职场文书
大学生学生会工作总结2015
2015/05/26 职场文书
教你怎么用Python生成九宫格照片
2021/05/20 Python
Python 内置函数速查表一览
2021/06/02 Python