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

一、概述

QTextEdit是一個高級的所見即所得的文檔查看器和編輯器,支持使用HTML4樣式標記的富文本格式,可以顯示圖像、列表和表格。

PyQt的富文本處理提供了一系列豐富的類,包括QTextEdit、QTextDocument、QTextCharFormat、QTextCursor、QTextBlock、QTextList、QTextFrame、QTextTable、QTextBlockFormat、QTextListFormat、QTextFrameFormat、QTextTableFormat等,如果要介紹清楚需要花比較多的時間,同時鑑於HTML的處理方面,可以利用Python中BeautifulSoup模塊強大的功能解析和編輯(可以參見老猿Python的爬蟲專題),因此本部分不進行詳細介紹。推薦大家按如下幾篇文章瞭解:

二、屬性

文本編輯QTextEdit在Designer中可以設置的屬性如下:
在這裏插入圖片描述

  • autoFormatting:autoFormatting屬性用於控制啓用自動格式化功能,其類型爲枚舉類型AutoFormattingFlag,默認值爲AutoNone即不起用,當設置爲AutoBulletList時,當用戶在最左邊的列中輸入星號(“*”)或在現有列表項中按Enter鍵時,自動創建項目符號列表,設置爲AutoAll目前與AutoBulletList相同,以後可能會有更多的擴展。該屬性可以使用方法autoFormatting() 、setAutoFormatting()來訪問。
  • tabChangesFocus:tabChangesFocus屬性控制tab鍵是否更改焦點還是接受爲輸入。在某些情況下,文本編輯不應允許用戶使用Tab鍵輸入製表符或更改縮進,因爲這樣會打斷焦點鏈,默認值爲False,可通過tabChangesFocus()和setTabChangesFocus()方法來訪問
  • documentTitle:documentTitle屬性保留從文本中分析的文檔標題( 通過HTML標記 )。默認情況下,對於新創建的空文檔,此屬性包含空字符串。可以通過方法documentTitle()、setDocumentTitle()來訪問。
  • undoRedoEnabled:undoRedoEnabled屬性用於控制是否啓用undo和redo,默認是啓用,可以通過方法isUndoRedoEnabled()、setUndoRedoEnabled()來訪問
  • lineWrapMode:lineWrapMode屬性用於控制換行模式,其類型爲枚舉類型QTextEdit.LineWrapMode,缺省值爲WidgetWidth,表示以詞爲單位在編輯器右邊換行,換行出現在空白處,保持整個單詞的完整性。可以調用方法lineWrapMode()、setLineWrapMode()來訪問該屬性。如果設置換行模式爲FixedPixelWidth 或 FixedColumnWidth ,同時需要調用setLineWrapColumnOrWidth()方法設置換行的像素寬度或字符數寬度,這兩種模式不會保持單詞的完整性
  • readOnly:readOnly 用於控制編輯器內是否只讀,默認爲False,可以通過isReadOnly()、setReadOnly()進行訪問
  • html:html屬性提供一個將編輯器內的文本轉換成html文本的接口,實際上在此設置的是一段具有完整head、html、body等tag要素的html格式化文字,如果內容不完整或語法錯誤就會用缺省的html文本代替。使用toHtml()將編輯器中的文字插入到html屬性對應的html文本的body內,可能會根據編輯器顯示文本的內容增加對應的標籤,因此如果要在編輯器中輸入HTML文本時,html文檔基本格式的相關標籤文本不要輸入,輸入了也沒有用,因爲編輯器會將相關手工輸入內容全部作爲純文本處理。使用setHtml()可以修改該屬性,但並不是簡單將輸入內容替換爲該屬性的值,而是將參數的內容進行解析去標籤後存放在編輯器中,類似於瀏覽器讀取html文檔一樣顯示,同時將非顯示內容的標準HTML文檔基本框架格式保存到html屬性中,期間大量參數中的html標籤會去除,如div的標籤中的內容是純文字,則div可能就不會保存,文字作爲普通文字顯示,再調用toHtml時也不會恢復這個div標籤,而是可能將其換成了p標籤。具體情況比較複雜,老猿也沒有仔細研究
  • 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
  • acceptRichText:acceptRichText屬性用於控制編輯器是否接受用戶的富文本插入(例如通過剪貼板或拖放),當此屬性設置爲False文本時,編輯器只接受來自用戶的純文本輸入。缺省值爲True,可以通過acceptRichText() 、setAcceptRichText()方法訪問
  • cursorWidth:cursorWidth用於設置編輯器光標的像素爲單位的寬度,缺省值爲1,可通過方法cursorWidth() 、setCursorWidth()來訪問
  • textInteractionFlags:textInteractionFlags屬性用於控制編輯器怎麼響應用戶的輸入,其類型爲Qt.TextInteractionFlags,用於控制編輯器是否可鍵盤或鼠標選擇文本、是否可編輯、鏈接是否鼠標或鍵盤訪問等,缺省值依賴於編輯器是否只讀或者是否派生類QTextBrowser對象,可通過textInteractionFlags()、setTextInteractionFlags()方法訪問,具體枚舉類型值參考官方文檔
  • placeholderText:placeholderText爲編輯器的佔位符,當編輯器中無文字時以灰色顯示在編輯器中,一旦輸入字符自動清除,可通過方法placeholderText()、setPlaceholderText()訪問

除了Designer中可以設置的屬性外,QLineEdit還有個plainText屬性:

  • plainText:plainText屬性用於保存編輯器中的純文本,調用toPlainText()會返回編輯器中的純文本,如果文本編輯具有其他內容類型(如html標記),調用toPlainText()不會將內容轉換爲純文本,唯一例外是會將&nbsp(non-break space,&nbsp在HTML中表示1個空格)替換爲空格,可以調用setPlainText()方法修改該屬性的值。請參考《PyQt(Python+Qt)學習隨筆:QTextEdit的setText、setHtml、setPlainText之間的區別

三、重要方法

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

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

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

  • insertHtml()方法:將參數給定文本按照HTML文本處理插入當前位置
  • 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)
  • setTextBackgroundColor()方法:setTextBackgroundColor是槽方法,設置背景色,可以通過textBackgroundColor()方法獲取對應值
  • setTextColor()方法:setTextColor是槽方法,設置文本顏色,可以通過textColor()獲取對應值
  • zoomIn()、zoomOut()方法:兩者都是槽方法,放大或縮小文本字體的大小指定參數大小,基本字體大小可以通過setFontPointSize設置

四、信號

  • copyAvailable(bool yes):當文本被選中或去選中時發射該信號,表示是否可拷貝,選中是yes爲True,去選中時爲False
  • currentCharFormatChanged(QTextCharFormat f):當前文本格式控制被改變時發射本信號
  • cursorPositionChanged():光標位置改變時發射該信號
  • redoAvailable(bool available):當redo的狀態發生變化時發射該信號
  • :selectionChanged():當選擇文本發生變化時發射該信號
  • textChanged():當文本內容發生變化時發射該信號
  • undoAvailable(bool available):當undo的狀態發生變化時發射該信號

五、小結

QTextEdit是一個所見即能得的富文本編輯器,可以使用setHtml()設置或替換文本,可以使用clear()刪除整個文本。文本本身可以使用QTextCursor類或使用便利函數insertHtml()、insertPlainText()、append()或paste()插入。QTextCursor還可以將複雜的對象(如表或列表)插入到文檔中,默認情況下,文本編輯以空白換行以適應文本編輯部件。
QTextEdit中的文本對象依賴於QTextDocument類進行管理,QTextDocument類藉助QTextCursor可以對文本進行豐富的操作。但限於時間和篇幅,本文並沒有對QTextDocument和QTextCursor進行詳細介紹。大家可以參考老猿提供的參考文檔或者官網文檔。

老猿Python,跟老猿學Python!

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