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_()

0 ответов

Другие вопросы по тегам