setBold(True) работает только если текстовый курсор не был перемещен, почему?
Я хочу установить выбранную часть текста жирным шрифтом. Я хочу сделать это в зависимости от формата персонажа. С помощью своего кода я могу определить этот формат, но установка жирного шрифта не работает. Если я раскомментирую эти 2 прокомментированные строки и прокомментирую все строки ниже (примите последние 5 строк, конечно), я могу установить код жирным шрифтом.
Этот код полностью работает, вы можете проверить его и, возможно, у вас есть идея. Вы выделяете текст мышью, а затем вызываете метод set-bold с помощью сочетания клавиш CTRL + B.
(Мои идеи: проблема, похоже, зависит от того факта, что я перемещаю QTextCursor, чтобы получить информацию о формате символов на другом конце выделения. Возможно, есть более простой способ получить эту информацию, но я только понял, но я не понимаю, почему движение textCursor является плохим, потому что оно все еще имеет правильный выбор, и я предполагаю, что font=self.currentFont() все еще работает.)
from PyQt4.QtGui import *
from PyQt4.QtCore import *
from PyQt4 import QtCore, QtGui
import sys,os
class test(QTextBrowser):
def __init__(self, parent=None):
super(QTextBrowser, self).__init__(parent=None)
self.setHtml("""
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII<br>IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII<br>
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII<br>IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII<br>
IIIIIIIIIIIII<b>IIIIIIIIIIIIIIIIIIIIIIII<br>IIIIIIIIIIIIIIIIIII</b>IIIIIIIIIIIIIIIIIIIIII<br>
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII<br>IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII<br>
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII<br>IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII<br>
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
""")
self.setReadOnly(False)
self.resize(400,400)
self.keylist=[]
self.installEventFilter(self)
def setBold(self):
font = self.currentFont()
cur=self.textCursor()
## font.setBold(True)
## self.setCurrentFont(font)
if cur.hasSelection():
print("Before: there is selected text.")
else:
print("Before: there is NO selected text.")
print("The anchor position is "+str(self.textCursor().anchor()))
print("The cursor position is "+str(self.textCursor().position()))
anchorPos=cur.anchor()
currentPos=cur.position()
if anchorPos>currentPos:
direction="rtl" #rigth to left selection
else:
direction="ltr" #left to right selection
print("The selection direction is "+str(direction))
oldPosition=cur.position()
if direction=="ltr":
selectedTextEnd = cur.charFormat()
cur.setPosition(cur.anchor(), QtGui.QTextCursor.KeepAnchor)
self.setTextCursor(cur)
selectedTextBeginning = cur.charFormat()
else:
selectedTextBeginning = cur.charFormat()
cur.setPosition(cur.anchor(), QtGui.QTextCursor.KeepAnchor)
self.setTextCursor(cur)
selectedTextEnd = cur.charFormat()
cur.setPosition(oldPosition, QtGui.QTextCursor.KeepAnchor)
if cur.hasSelection():
print("After: there is selected text.")
else:
print("After: there is NO selected text.")
print("fontWeight begin = "+str(selectedTextBeginning.fontWeight() ) )
print("fontWeight end = "+str(selectedTextEnd.fontWeight() ) )
if selectedTextBeginning.fontWeight()==50 and selectedTextEnd.fontWeight()==75:
print("Check 1")
font.setBold(False)
self.setCurrentFont(font)
if selectedTextBeginning.fontWeight()==75 and selectedTextEnd.fontWeight()==75:
print("Check 2")
font.setBold(False)
self.setCurrentFont(font)
if selectedTextBeginning.fontWeight()==50 and selectedTextEnd.fontWeight()==50:
print("Check 3")
font.setBold(True)
self.setCurrentFont(font)
if selectedTextBeginning.fontWeight()==75 and selectedTextEnd.fontWeight()==50:
print("Check 4")
font.setBold(True)
self.setCurrentFont(font)
cur.setPosition(oldPosition, QtGui.QTextCursor.MoveAnchor)
def eventFilter(self, target, event):
if event.type()==QEvent.KeyPress:
if "Ctrl" in self.keylist:
self.keylist.append(str(event.key()))
if event.key()==Qt.Key_Control:
self.keylist.append("Ctrl")
return False
def processmultikeys(self,keyspressed):
if keyspressed[0]=="Ctrl" and keyspressed[1]=="66": #ctrl and B
self.setBold()
def keyReleaseEvent(self,event):
if len(self.keylist)==2:
self.processmultikeys(self.keylist)
del self.keylist[-1]
else:
self.keylist=[]
if __name__ == '__main__':
app=QApplication(sys.argv)
a = test()
a.show()
app.exec_()