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之for循环语句
Oct 02 Python
python 队列详解及实例代码
Oct 18 Python
Python设计模式之代理模式简单示例
Jan 09 Python
Anaconda2 5.2.0安装使用图文教程
Sep 19 Python
Python实现操纵控制windows注册表的方法分析
May 24 Python
python按修改时间顺序排列文件的实例代码
Jul 25 Python
Python 3.6 中使用pdfminer解析pdf文件的实现
Sep 25 Python
在Python中预先初始化列表内容和长度的实现
Nov 28 Python
用python3读取python2的pickle数据方式
Dec 25 Python
python tqdm库的使用
Nov 30 Python
matplotlib之属性组合包(cycler)的使用
Feb 24 Python
Python趣味实战之手把手教你实现举牌小人生成器
Jun 07 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 清除网页病毒的方法
2008/12/05 PHP
PHP中遇到的时区问题解决方法
2015/07/23 PHP
一个刚完成的layout(拖动流畅,不受iframe影响)
2007/08/17 Javascript
一个JQuery操作Table的代码分享
2012/03/30 Javascript
html中的input标签的checked属性jquery判断代码
2012/09/19 Javascript
可选择和输入的下拉列表框示例
2013/11/05 Javascript
详解AngularJS中的表格使用
2015/06/16 Javascript
js实现商品抛物线加入购物车特效
2020/11/18 Javascript
JS点击某个图标或按钮弹出文件选择框的实现代码
2016/09/27 Javascript
Node.js 实现简单小说爬虫实例
2016/11/18 Javascript
原生js实现焦点轮播图效果
2017/01/12 Javascript
jquery实现全选、全不选以及单选功能
2017/03/23 jQuery
vue.js声明式渲染和条件与循环基础知识
2017/07/31 Javascript
Postman模拟发送带token的请求方法
2018/03/31 Javascript
Vue2.0 实现歌手列表滚动及右侧快速入口功能
2018/08/08 Javascript
Vue 报错TypeError: this.$set is not a function 的解决方法
2018/12/17 Javascript
vue指令做滚动加载和监听等
2019/05/26 Javascript
简单谈谈javascript高级特性
2019/09/04 Javascript
使用layer弹窗,制作编辑User信息页面的方法
2019/09/27 Javascript
Vue + ts实现轮播插件的示例
2020/11/10 Javascript
python切换hosts文件代码示例
2013/12/31 Python
解析Python中的生成器及其与迭代器的差异
2016/06/20 Python
浅谈Python中range和xrange的区别
2017/12/20 Python
python实现寻找最长回文子序列的方法
2018/06/02 Python
Python读取Excel表格,并同时画折线图和柱状图的方法
2018/10/14 Python
使用Python函数进行模块化的实现
2019/11/15 Python
基于tensorflow指定GPU运行及GPU资源分配的几种方式小结
2020/02/03 Python
python字符串替换re.sub()实例解析
2020/02/09 Python
Pycharm学生免费专业版安装教程的方法步骤
2020/09/24 Python
音乐教育感言
2014/03/05 职场文书
新农村建设汇报材料
2014/08/15 职场文书
违反交通法规检讨书
2014/09/10 职场文书
2014年禁毒工作总结
2014/11/24 职场文书
我们的节日元宵节活动总结
2015/02/06 职场文书
惊涛骇浪观后感
2015/06/05 职场文书
2019初中学生入团申请书
2019/06/27 职场文书