侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

python3+PyQt5 实现Rich文本的行编辑方法

Python  /  管理员 发布于 7年前   231

本文通过Python3+PyQt5实现《python Qt Gui 快速编程》这本书13章程序Rich文本的行编辑,可以通过鼠标右键选择对文本进行加粗,斜体,下划线,删除线,上标,下标等编辑。

#!/usr/bin/env python3import platformimport sysimport htmlfrom PyQt5.QtCore import QSize, Qt,pyqtSignalfrom PyQt5.QtGui import QColor, QFont,QFontMetrics, QIcon, QKeySequence, QPixmap,QTextCharFormatfrom PyQt5.QtWidgets import QAction,QApplication,QMenu,QTextEditclass RichTextLineEdit(QTextEdit):  returnPressed=pyqtSignal()  (Bold, Italic, Underline, StrikeOut, Monospaced, Sans, Serif,   NoSuperOrSubscript, Subscript, Superscript) = range(10)  def __init__(self, parent=None):    super(RichTextLineEdit, self).__init__(parent)    self.monofamily = "courier"    self.sansfamily = "helvetica"    self.seriffamily = "times"    self.setLineWrapMode(QTextEdit.NoWrap)    self.setTabChangesFocus(True)    self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)    self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)    fm = QFontMetrics(self.font())    h = int(fm.height() * (1.4 if platform.system() == "Windows"      else 1.2))    self.setMinimumHeight(h)    self.setMaximumHeight(int(h * 1.2))    self.setToolTip("Press <b>Ctrl+M</b> for the text effects "        "menu and <b>Ctrl+K</b> for the color menu")  def toggleItalic(self):    self.setFontItalic(not self.fontItalic())  def toggleUnderline(self):    self.setFontUnderline(not self.fontUnderline())  def toggleBold(self):    self.setFontWeight(QFont.Normal        if self.fontWeight() > QFont.Normal else QFont.Bold)  def sizeHint(self):    return QSize(self.document().idealWidth() + 5,           self.maximumHeight())  def minimumSizeHint(self):    fm = QFontMetrics(self.font())    return QSize(fm.width("WWWW"), self.minimumHeight())  def contextMenuEvent(self, event):    self.textEffectMenu()  def keyPressEvent(self, event):    if event.modifiers() & Qt.ControlModifier:      handled = False      if event.key() == Qt.Key_B:        self.toggleBold()        handled = True      elif event.key() == Qt.Key_I:        self.toggleItalic()        handled = True      elif event.key() == Qt.Key_K:        self.colorMenu()        handled = True      elif event.key() == Qt.Key_M:        self.textEffectMenu()        handled = True      elif event.key() == Qt.Key_U:        self.toggleUnderline()        handled = True      if handled:        event.accept()        return    if event.key() in (Qt.Key_Enter, Qt.Key_Return):      self.returnPressed.emit()      event.accept()    else:      QTextEdit.keyPressEvent(self, event)  def colorMenu(self):    pixmap = QPixmap(22, 22)    menu = QMenu("Colour")    for text, color in (        ("&Black", Qt.black),        ("B&lue", Qt.blue),        ("Dark Bl&ue", Qt.darkBlue),        ("&Cyan", Qt.cyan),        ("Dar&k Cyan", Qt.darkCyan),        ("&Green", Qt.green),        ("Dark Gr&een", Qt.darkGreen),        ("M&agenta", Qt.magenta),        ("Dark Mage&nta", Qt.darkMagenta),        ("&Red", Qt.red),        ("&Dark Red", Qt.darkRed)):      color = QColor(color)      pixmap.fill(color)      action = menu.addAction(QIcon(pixmap), text, self.setColor)      action.setData(color)    self.ensureCursorVisible()    menu.exec_(self.viewport().mapToGlobal(          self.cursorRect().center()))  def setColor(self):    action = self.sender()    if action is not None and isinstance(action, QAction):      color = QColor(action.data())      if color.isValid():        self.setTextColor(color)  def textEffectMenu(self):    format = self.currentCharFormat()    menu = QMenu("Text Effect")    for text, shortcut, data, checked in (        ("&Bold", "Ctrl+B", RichTextLineEdit.Bold,         self.fontWeight() > QFont.Normal),        ("&Italic", "Ctrl+I", RichTextLineEdit.Italic,         self.fontItalic()),        ("Strike &out", None, RichTextLineEdit.StrikeOut,         format.fontStrikeOut()),        ("&Underline", "Ctrl+U", RichTextLineEdit.Underline,         self.fontUnderline()),        ("&Monospaced", None, RichTextLineEdit.Monospaced,         format.fontFamily() == self.monofamily),        ("&Serifed", None, RichTextLineEdit.Serif,         format.fontFamily() == self.seriffamily),        ("S&ans Serif", None, RichTextLineEdit.Sans,         format.fontFamily() == self.sansfamily),        ("&No super or subscript", None,         RichTextLineEdit.NoSuperOrSubscript,         format.verticalAlignment() ==         QTextCharFormat.AlignNormal),        ("Su&perscript", None, RichTextLineEdit.Superscript,         format.verticalAlignment() ==         QTextCharFormat.AlignSuperScript),        ("Subs&cript", None, RichTextLineEdit.Subscript,         format.verticalAlignment() ==         QTextCharFormat.AlignSubScript)):      action = menu.addAction(text, self.setTextEffect)      if shortcut is not None:        action.setShortcut(QKeySequence(shortcut))      action.setData(data)      action.setCheckable(True)      action.setChecked(checked)    self.ensureCursorVisible()    menu.exec_(self.viewport().mapToGlobal(          self.cursorRect().center()))  def setTextEffect(self):    action = self.sender()    if action is not None and isinstance(action, QAction):      what = action.data()      if what == RichTextLineEdit.Bold:        self.toggleBold()        return      if what == RichTextLineEdit.Italic:        self.toggleItalic()        return      if what == RichTextLineEdit.Underline:        self.toggleUnderline()        return      format = self.currentCharFormat()      if what == RichTextLineEdit.Monospaced:        format.setFontFamily(self.monofamily)      elif what == RichTextLineEdit.Serif:        format.setFontFamily(self.seriffamily)      elif what == RichTextLineEdit.Sans:        format.setFontFamily(self.sansfamily)      if what == RichTextLineEdit.StrikeOut:        format.setFontStrikeOut(not format.fontStrikeOut())      if what == RichTextLineEdit.NoSuperOrSubscript:        format.setVerticalAlignment(QTextCharFormat.AlignNormal)      elif what == RichTextLineEdit.Superscript:        format.setVerticalAlignment(QTextCharFormat.AlignSuperScript)      elif what == RichTextLineEdit.Subscript:        format.setVerticalAlignment(QTextCharFormat.AlignSubScript)      self.mergeCurrentCharFormat(format)  def toSimpleHtml(self):    htmltext = ""    black = QColor(Qt.black)    block = self.document().begin()    while block.isValid():      iterator = block.begin()      while iterator != block.end():        fragment = iterator.fragment()        if fragment.isValid():          format = fragment.charFormat()          family = format.fontFamily()          color = format.foreground().color()       text=html.escape(fragment.text())          if (format.verticalAlignment() ==QTextCharFormat.AlignSubScript):text = "<sub>{0}</sub>".format(text)          elif (format.verticalAlignment() == QTextCharFormat.AlignSuperScript):text = "<sup>{0}</sup>".format(text)          if format.fontUnderline():text = "<u>{0}</u>".format(text)          if format.fontItalic():text = "<i>{0}</i>".format(text)          if format.fontWeight() > QFont.Normal:text = "<b>{0}</b>".format(text)          if format.fontStrikeOut():text = "<s>{0}</s>".format(text)          if color != black or family:attribs = ""if color != black:  attribs += ' color="{0}"'.format(color.name())if family:  attribs += ' face="{0}"'.format(family)text = "<font{0}>{1}</font>".format(attribs,text)          htmltext += text        iterator += 1      block = block.next()    return htmltextif __name__ == "__main__":  def printout(lineedit):    print(str(lineedit.toHtml()))    print(str(lineedit.toPlainText()))    print(str(lineedit.toSimpleHtml()))          app = QApplication(sys.argv)  lineedit = RichTextLineEdit()  lineedit.returnPressed.connect(lambda:printout(lineedit))  lineedit.show()  lineedit.setWindowTitle("RichTextEdit")  app.exec_()

以上这篇python3+PyQt5 实现Rich文本的行编辑方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


  • 上一条:
    python文本数据处理学习笔记详解
    下一条:
    Appium+python自动化之连接模拟器并启动淘宝APP(超详解)
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客