2 回答

TA貢獻1725條經驗 獲得超8個贊
必須考慮的重要事項QTextCursor.charFormat()
是:
返回光標position?(?)之前字符的格式。
因此,這不僅不能很好地處理包含多種字符格式的選擇,而且您還必須考慮光標位置,它可能會在選擇中發生變化:它可能在開頭(因此它會返回格式選擇之前的字符)或結尾(返回選擇中最后一個字符的格式)。
如果要根據當前光標位置反轉狀態(如果在開頭,則使用第一個字符,如果在結尾,則使用最后一個),則可以使用以下內容:

TA貢獻1827條經驗 獲得超8個贊
def toggle_italic_text(self):
cursor = self.textEdit.textCursor()
if not cursor.hasSelection():
charFormat = cursor.charFormat()
charFormat.setFontItalic(not charFormat.fontItalic())
cursor.setCharFormat(charFormat)
# in this case, the cursor has to be applied to the textEdit to ensure
# that the following typed characters use the new format
self.textEdit.setTextCursor(cursor)
return
start = cursor.selectionStart()
end = cursor.selectionEnd()
newCursor = QtGui.QTextCursor(self.textEdit.document())
newCursor.setPosition(start)
if cursor.position() == start:
cursor.setPosition(start + 1)
charFormat = cursor.charFormat()
charFormat.setFontItalic(not charFormat.fontItalic())
newCursor.setPosition(end, cursor.KeepAnchor)
newCursor.mergeCharFormat(charFormat)
如果要反轉選擇中的所有狀態,則需要循環遍歷所有字符。
雖然您可以只更改每個字符的 char 格式,但這對于非常大的選擇來說并不是一件好事,因此解決方案是僅在 char 格式實際從以前的狀態發生變化時應用斜體,并且在選擇結束。
def toggle_italic_text(self):
# ...
start = cursor.selectionStart()
end = cursor.selectionEnd()
newCursor = QtGui.QTextCursor(self.textEdit.document())
newCursor.setPosition(start)
cursor.setPosition(start)
prevState = cursor.charFormat().fontItalic()
while cursor.position() < end:
cursor.movePosition(cursor.Right)
charFormat = cursor.charFormat()
if charFormat.fontItalic() != prevState or cursor.position() >= end:
newPos = cursor.position()
if cursor.position() < end:
newPos -= 1
newCursor.setPosition(newPos, cursor.KeepAnchor)
charFormat.setFontItalic(not prevState)
newCursor.mergeCharFormat(charFormat)
prevState = not prevState
newCursor.setPosition(cursor.position() - 1)
添加回答
舉報