PyQt(Python+Qt)學習隨筆:純文本編輯器QPlainTextEdit功能詳解

一、概述

QPlainTextEdit是用於純文本的一個高級文檔編輯器部件,爲支持處理大文檔和快速響應用戶輸入進行了特定優化。QPlainTextEdit處理文本是按段和字符,段落是一個格式化的字符串,界面換行會以適應編輯部件的寬度方式以整詞詞爲單位進行。默認情況下,純文本中的一個換行符表示一個段落。文檔由零個或多個段落組成。段落中的每個字符都有自己的屬性,例如字體和顏色。

PyQt的文本處理提供了一系列豐富的類,包括QTextDocument、QTextCharFormat、QTextCursor、QTextBlock、QTextList、QTextFrame、QTextTable、QTextBlockFormat、QTextListFormat、QTextFrameFormat、QTextTableFormat等,如果要介紹清楚需要花比較多的時間,因此本部分不展開進行介紹。推薦大家按如下兩篇文章瞭解:

二、屬性

文本編輯QPlainTextEdit在Designer中可以設置的屬性如下:
在這裏插入圖片描述
可以看到QPlainTextEdit的屬性與QTextEdit的屬性很多是相同的。

  • tabChangesFocus:tabChangesFocus屬性控制tab鍵是否更改焦點還是接受爲輸入。在某些情況下,文本編輯不應允許用戶使用Tab鍵輸入製表符或更改縮進,因爲這樣會打斷焦點鏈,默認值爲False,可通過tabChangesFocus()和setTabChangesFocus()方法來訪問
  • documentTitle:documentTitle屬性保存文檔標題。默認情況下,對於新創建的空文檔,此屬性包含空字符串。可以通過方法documentTitle()、setDocumentTitle()來訪問。
  • undoRedoEnabled:undoRedoEnabled屬性用於控制是否啓用undo和redo,默認是啓用,可以通過方法isUndoRedoEnabled()、setUndoRedoEnabled()來訪問
  • lineWrapMode:lineWrapMode屬性用於控制換行模式,其類型爲枚舉類型QPlainTextEdit.LineWrapMode,缺省值爲WidgetWidth,表示以詞爲單位在編輯器右邊換行,換行出現在空白處,保持整個單詞的完整性。可以調用方法lineWrapMode()、setLineWrapMode()來訪問該屬性。如果不以詞爲單位來換行,則需要調用setWordWrapMode來改變詞換行的策略。如果設置換行模式爲NoWrap 則不會換行。
  • readOnly:readOnly 用於控制編輯器內是否只讀,默認爲False,可以通過isReadOnly()、setReadOnly()進行訪問
  • plainText:plainText屬性爲編輯器中的文本內容,可以通過方法toPlainText()、setPlainText()來進行屬性訪問,當通過setPlainText來改變文本內容時,也會觸發textChanged()信號
  • overwriteMode:overwriteMode屬性用於控制用戶輸入文本是否替換現有文本,如果爲True,則輸入字符從當前光標位置開始逐一替換當前的字符,爲False則在光標處插入輸入字符。缺省值爲False,可以通過方法overwriteMode()、setOverwriteMode()進行訪問
  • tabStopWidth:tabStopWidth屬性用於控制編輯器中輸入tab鍵時移動的像素數,默認值爲80像素,可以通過方法tabStopWidth()、setTabStopWidth()來訪問,不過該屬性在Qt 5.10以後版本中被下面的tabStopDistance所替代,在5.13的文檔中就沒有該屬性,但實際上類方法還是支持的,tabStopWidth與tabStopDistance的唯一區別是前者爲整型、後者爲浮點數,更精確,在Designer中二者的值也是聯動的,tabStopWidth改變直接修改tabStopDistance爲tabStopWidth的值,如果tabStopDistance值改變,則將tabStopDistance四捨五入後的值作爲tabStopWidth的值,最終生成的代碼tabStopDistance、tabStopWidth都會設置,這個與QTextEdit不同
  • cursorWidth:cursorWidth用於設置編輯器光標的像素爲單位的寬度,缺省值爲1,可通過方法cursorWidth() 、setCursorWidth()來訪問
  • textInteractionFlags:textInteractionFlags屬性用於控制編輯器怎麼響應用戶的輸入,其類型爲Qt.TextInteractionFlags,用於控制編輯器是否可鍵盤或鼠標選擇文本、是否可編輯、鏈接是否鼠標或鍵盤訪問等,缺省值依賴於編輯器是否只讀,可通過textInteractionFlags()、setTextInteractionFlags()方法訪問,具體枚舉類型值參考官方文檔
  • maximumBlockCount:maximumBlockCount屬性用於控制編輯器中文檔最大的塊數,如果設定該屬性的值時文檔的塊數已經超出了該值,則會從文檔的開頭去除多餘的塊數。如果值爲0或負數表示文檔的塊數不受限制,缺省值爲0,可通過方法maximumBlockCount()、setMaximumBlockCount()訪問該屬性的值
    :塊是文本編輯器處理文件的單位,一個文檔由一系列塊組成,塊由 QTextBlock對象表示,使用QTextBlockFormat來控制塊的格式特徵信息,塊的類型可以是文本段、表格、列表、圖像等
  • backgroundVisible:backgroundVisible屬性用於控制背景調色板在文檔外區域是否可見,如果設置爲True,編輯器視口中沒有文本覆蓋的部分也會使用調色板繪製背景,否擇不繪製。該功能使用戶能夠直觀地區分使用調色板的基色繪製的文檔區域和任何文檔未覆蓋的空白區域。如圖:
    在這裏插入圖片描述
  • centerOnScroll:centerOnScroll屬性保留光標是否應在屏幕上居中。如果設置爲True,則純文本編輯將垂直滾動文檔,使光標在視口中心可見。這也允許文本編輯滾動到文檔末尾下方。否則,如果設置爲False,則純文本編輯將滾動儘可能小的數量以確保光標可見。默認值爲False,可以通過方法centerOnScroll()、setCenterOnScroll()進行訪問
  • placeholderText:placeholderText爲編輯器的佔位符,當編輯器中無文字時以灰色顯示在編輯器中,一旦輸入字符自動清除,可通過方法placeholderText()、setPlaceholderText()訪問

三、重要方法

下面複雜的方法會介紹調用語法,不復雜的方法就不介紹調用語法,大家可以官方文檔速查:

  • appendHtml()方法:槽方法,用於在編輯器末尾增加一段參數所指的html文本。雖然QPlainTextEdit是個純文本編輯器,但也是可以解析html報文的,使用appendHtml方法將html報文增加後,在界面上顯示的是解析後的內容
案例:

使用appendHtml和appendPlainText將同一段html報文加

  html = '''<link  href="https://blog.csdn.net/LaoYuanPython"/><title>老猿Python</title><div>老猿Python網址:https://blog.csdn.net/LaoYuanPython</div>'''
  self.plainTextEdit.appendHtml(html)
  self.plainTextEdit.appendPlainText('\n************************************************\n')
  self.plainTextEdit.appendPlainText(html)

執行後界面顯示效果如下:
在這裏插入圖片描述

  • appendPlainText():槽方法,用於在編輯器末尾增加一段參數所指的純文本
  • blockCount()方法:用於獲取文檔中的塊數,空文檔的塊數爲1
  • canPaste()方法:用於返回是否可以從剪切板中粘貼文本到編輯器中
  • clear()方法:槽方法,清楚編輯器中所有文本,redo/undo歷史也會被清除
  • copy()方法:槽方法,用於將編輯器中選中文本拷貝到剪切板中
  • cut()方法:槽方法,用於將編輯器中選中文本拷貝到剪切板中後刪除
  • createStandardContextMenu()方法:
    這個方法都用於創建在編輯器中使用鼠標右鍵時顯示的彈出菜單,只不過有帶參和不帶參的兩種調用方式,帶參數的是在文檔中指定位置彈出,這樣可以實現在編輯器的不同位置會彈出不同的快捷菜單。調用語法:createStandardContextMenu()、createStandardContextMenu(QPoint position)
  • currentCharFormat()方法:返回當前的字符格式,其類型爲QTextCharFormat,QTextCharFormat用於控制QTextEdit中的文本格式(這些文本的存儲類型爲QTextDocument對象,可以通過QTextEdit的document()方法獲取,關於QTextCharFormat和QTextDocument對象在本文中不詳細介紹),這些文本格式控制信息用於指定文本的一些可視化格式,如同超文本中的可視化格式控制信息
  • cursorForPosition()方法:返回指定位置的QTextCursor文本光標對象,QTextCursor文本光標是通過模擬文本編輯器中光標行爲的編程接口,用於訪問和修改文本文檔的內容和底層結構的對象。QTextCursor包含有關光標在QTextDocument中的位置及其所做的任何選擇的信息。QTextCursor是根據文本光標在文本編輯器中的行爲方式建模的,它提供了通過用戶界面執行標準操作的編程方法。
  • document()方法:document方法返回文本編輯器依賴的QTextDocument文檔管理對象,通過該對象可以對文本進行豐富的操作,可以調用setDocument方法改變文本編輯器的文檔對象
  • ensureCursorVisible()方法:使用該方法確保編輯器中的光標可見,如果當前不可見則可以滾動文本
  • find()方法:在編輯器中查找指定字符串,調用語法:
  • bool find(str exp, QTextDocument.FindFlags options =
    QTextDocument.FindFlags())
  • bool find(QRegExp exp, QTextDocument.FindFlags options =
    QTextDocument.FindFlags())

其中的exp可以是普通字符串,也可是QRegExp 類型的正則表達式,其中options用於指定是向前或向後查找、查找時是否匹配大小寫、是否整詞匹配,具體取值請參考官方文檔。當exp爲正則表達式則是否匹配大小寫的選項被忽略,而是由正則表達式來控制是否匹配大小寫

  • insertPlainText()方法:將參數給定文本插入當前位置
  • moveCursor()方法:控制編輯器中光標進行移動,調用語法:moveCursor(operation, mode = QTextCursor.MoveAnchor),其中operation爲枚舉類型QTextCursor.MoveOperation,用於控制光標的移動方式,如移動到文檔開始、移動到行首等,具體取值參考官方文檔,mode 爲枚舉類型QTextCursor.MoveMode,具體取值參考官方文檔
  • paste()方法:paste是槽方法,將剪切板的文本拷貝到當前位置
  • redo()、undo()方法:undo、redo是槽方法,undo()方法執行後可以使用redo重新執行最後一次的操作
  • selectAll()方法:selectAll是槽方法,選擇所有文本
  • setCurrentCharFormat()方法:設置文本格式控制信息,調用語法:setCurrentCharFormat(QTextCharFormat format)
  • setTextCursor()方法:setTextCursor方法用於設置當前可見的光標對象,調用語法:setTextCursor(QTextCursor cursor),當前光標對象可通過textCursor()方法獲取
  • zoomIn()、zoomOut()方法:兩者都是槽方法,放大或縮小文本字體的大小指定參數大小,基本字體大小可以通過setFontPointSize設置

四、信號

  • blockCountChanged(int newBlockCount):當文本中塊數發生變化時發射該信號,參數爲最新的塊數
  • copyAvailable(bool yes):當文本被選中或去選中時發射該信號,表示是否可拷貝,選中是yes爲True,去選中時爲False
  • cursorPositionChanged():光標位置改變時發射該信號
  • modificationChanged(bool changed):文檔的內容發生改變(包括undo和redo操作引發的文檔內容改變)時就發射該信號
  • redoAvailable(bool available):當redo的狀態發生變化時發射該信號
  • :selectionChanged():當選擇文本發生變化時發射該信號
  • textChanged():當文本內容發生變化時發射該信號
  • undoAvailable(bool available):當undo的狀態發生變化時發射該信號
  • updateRequest(QRect rect, int dy):當文本文檔需要更新指定的rect區域時,會發出此信號。如果文本是滾動的,rect將覆蓋整個視區。如果文本是垂直滾動的,則dy攜帶滾動的視區像素數。該信號的目的是支持純文本編輯子類中的額外部件,例如顯示行號、斷點或其他額外信息。

五、小結

QPlainTextEdit的很多功能支持技術與 QTextEdit相同。與QTextEdit相同,QPlainTextEdit中的文本對象依賴於QTextDocument類進行管理,QTextDocument類藉助QTextCursor可以對文本進行豐富的操作。但限於時間和篇幅,本文並沒有對QTextDocument和QTextCursor進行詳細介紹。大家可以參考概述部分老猿提供的參考文檔或者官網文檔。

老猿Python,跟老猿學Python!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章