找回密码
 立即注册
Qt开源社区 门户 查看内容

PyQt5 单行Rich文本编辑器

2019-7-27 13:47| 发布者: admin| 查看: 1104| 评论: 0

摘要: 本篇会创建一个单行的Rich文本编辑器,它与QLineEdit类似,但会有右键弹出菜单,也可以支持多个格式化快捷键,如使用Ctrl +B 和 Ctrl + I 分别来切换文本的加粗和斜体效果。代码如下:import platformimport sysimpo ...
本篇会创建一个单行的Rich文本编辑器,它与QLineEdit类似,但会有右键弹出菜单,也可以支持多个格式化快捷键,如使用Ctrl +B 和 Ctrl + I 分别来切换文本的加粗和斜体效果。



代码如下:
    import 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,QTextEdit

    class 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.4if platform.system() == "Windows"else1.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")
    deftoggleItalic(self):self.setFontItalic(notself.fontItalic())
    deftoggleUnderline(self):self.setFontUnderline(notself.fontUnderline())
    deftoggleBold(self):self.setFontWeight(QFont.Normalifself.fontWeight() > QFont.Normal else QFont.Bold)
    defsizeHint(self):return QSize(self.document().idealWidth() + 5,self.maximumHeight())
    defminimumSizeHint(self): fm = QFontMetrics(self.font())return QSize(fm.width("WWWW"), self.minimumHeight())
    defcontextMenuEvent(self, event):self.textEffectMenu()
    defkeyPressEvent(self, event):if event.modifiers() & Qt.ControlModifier: handled = Falseif 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 = Trueifhandled: event.accept()returnif event.key() in (Qt.Key_Enter, Qt.Key_Return):self.returnPressed.emit() event.accept()else: QTextEdit.keyPressEvent(self, event)
    defcolorMenu(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()))
    defsetColor(self): action = self.sender()if action is not None and isinstance(action, QAction): color = QColor(action.data())if color.isValid():self.setTextColor(color)
    deftextEffectMenu(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 notNone: action.setShortcut(QKeySequence(shortcut)) action.setData(data) action.setCheckable(True) action.setChecked(checked)self.ensureCursorVisible() menu.exec_(self.viewport().mapToGlobal(self.cursorRect().center()))
    defsetTextEffect(self): action = self.sender()if action is not None and isinstance(action, QAction): what = action.data()if what == RichTextLineEdit.Bold:self.toggleBold()returnif what == RichTextLineEdit.Italic:self.toggleItalic()returnif 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)
    deftoSimpleHtml(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 orfamily: attribs = ""if color != black: attribs += ' color="{0}"'.format(color.name())iffamily: attribs += ' face="{0}"'.format(family) text = "<font{0}>{1}</font>".format(attribs,text) htmltext += text iterator += 1 block = block.next()return htmltext

    if __name__ == "__main__":defprintout(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_()
    ----------------------------------------------------------------------------------------------------------------------
    我们尊重原创,也注重分享,文章来源于微信公众号:Python编程 pyqt matplotlib,建议关注公众号查看原文。如若侵权请联系qter@qter.org。
    ----------------------------------------------------------------------------------------------------------------------

    鲜花

    握手

    雷人

    路过

    鸡蛋
    
    公告
    可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了