Pyqt中富文本编辑器
对于文本编辑,qt提供了很多控件
- QLineEdit:单行文本输入,比如用户名密码等简单的较短的或者具有单一特征的字符串内容输入。使用text、settext读写
- QTextEdit:富文本编辑器,支持html显示,可以用sethtml/tohtml进行html文本操作或使用,也可利用setPlainText、toPlainText进行纯文本操作
- QPlainTextEdit:纯文本编辑器,使用了近似于textedit的技术并做了纯文本编辑的优化,并具有文章段落的概念也提供了撤销等功能,但不支持html显示。
- QTextBrowser:继承于QTextEdit,仅提供显示功能,并提供了超文本导航功能,如果不需要超文本连接只需要使用QTextEdit并设置QTextEdit::setReadOnly
上述都是显示控件,可以确定的是富文本编辑器要用QTextEdit或者QPlainTextEdit,但是肯定不能主动撰写html代码或者逐个处理显示格式实现富文本,实际上Qt提供了相关类:QTextDocument富文本文档、QTextBlock文本快、QTextFrame框架、QTextTable表格、QTextList列表、QTextCursor指针位置、QTextXXXXFormat各种数据类型样式。对于富文本的所有帮助请见官方文档:Rich Text Processing
QTextEdit和QPlainTextEdit选择:差异是QTextEdit提供了tohtml,如果想在处理完文档,直接根据文档生成html作为博客等内容,可以使用此类,没有需要后者即可
注意关系:QTextDocument>QTextFrame>QTextBlock/QTextTable/QTextList前包含后
查看两个类的api,均提供了document方法,可以返回QTextDocument指针,用于通过QTextDocument的方式操作文档内容格式,官方范例:
Application Example这个比较简单
Syntax Highlighter Example语法高亮的例子
Text Edit Example类似于word编辑器的例子
Calendar Example利用富文本编辑器的方式实现日历(不建议学这个毕竟已经有现成的日历控件,而且文档中往往也不会插入日历)
Order Form Example根据一些的参数设置生成报表,其实和上面的原理一样
基本使用
import sys from PyQt4.QtGui import * from PyQt4.QtCore import * class Calculate(QDialog): def __init__(self,parent=None): super(Calculate,self).__init__(parent) self.browser = QTextBrowser() self.browser.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn) self.line_edit = QLineEdit('Type an expression an press Enter') self.line_edit.setFocusPolicy(Qt.StrongFocus) self.line_edit.selectAll() layout = QVBoxLayout() layout.addWidget(self.browser) layout.addWidget(self.line_edit) self.setLayout(layout) self.setWindowTitle('Calculate') self.connect(self.line_edit,SIGNAL('returnPressed ()'),self.update_ui) def update_ui(self): try: line_text = unicode(self.line_edit.text()) self.browser.append('%s = <b>%s</b>' %(line_text,eval(line_text))) except: self.browser.append('<font color=red>%s is invalid!</font>' %(line_text)) self.line_edit.selectAll() if __name__ == "__main__": app = QApplication(sys.argv) cal = Calculate() cal.show() sys.exit(app.exec_())
参考文档:https://www.techieliang.com/2017/12/726/