2 回答

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

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超8個(gè)贊
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)
如果要反轉(zhuǎn)選擇中的所有狀態(tài),則需要循環(huán)遍歷所有字符。
雖然您可以只更改每個(gè)字符的 char 格式,但這對(duì)于非常大的選擇來(lái)說(shuō)并不是一件好事,因此解決方案是僅在 char 格式實(shí)際從以前的狀態(tài)發(fā)生變化時(shí)應(yīng)用斜體,并且在選擇結(jié)束。
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)
添加回答
舉報(bào)