使用按钮将富文本添加到QTextEdit中

2024-10-02 08:19:30 发布

您现在位置:Python中文网/ 问答频道 /正文

在PyQt5中,我有一些创建按钮的代码。我还有一个QTextEdit小部件,我在其中键入文本。我想要的是,每次单击按钮时,它都允许我向QTextEdit添加粗体文本,如果我再次单击它,它将停止添加粗体文本。我该怎么做

这是我的代码:

#Import Module
from PyQt5.QtGui import QFont
from PyQt5 import QtWidgets
from PyQt5 import QtCore
from PyQt5.QtCore import Qt
from PyQt5 import QtGui
import sys

class AddToDeckWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super(AddToDeckWindow, self).__init__()

        #Set The UI
        self.initUI()

        #Set The GUI Position And Size
        self.setGeometry(200, 200, 900, 710)

        #Set The GUI Title
        self.setWindowTitle("Add")

        #Set The GUI Icon
        self.setWindowIcon(QtGui.QIcon('give_way.png'))

        #Set The Translator
        _translate = QtCore.QCoreApplication.translate
        
    def initUI(self):

        #Set Font For The Bold Label Button
        boldFont = QFont()
        boldFont.setFamily(u"Corbel")
        boldFont.setPointSize(19)
        boldFont.setBold(True)
        boldFont.setWeight(75)

        #Create The Bold Label Button
        self.boldButton = QtWidgets.QLabel(self)
        self.boldButton.setText("B")
        self.boldButton.setFont(boldFont)
        self.boldButton.adjustSize()

        #Create The Text Box
        textBox = QtWidgets.QTextEdit(self)
        textBox.setGeometry(100, 100, 500, 200)

        #Set The Font
        font = QFont()
        font.setPointSize(14)
        textBox.setFont(font)

#Create A Windows
def window():
    app = QtWidgets.QApplication(sys.argv)
    win = AddToDeckWindow()

    #Centers The Window On The Screen
    qtRectangle = win.frameGeometry()
    centerPoint = QtWidgets.QDesktopWidget().availableGeometry().center()
    qtRectangle.moveCenter(centerPoint)
    win.move(qtRectangle.topLeft())


    win.show()
    sys.exit(app.exec_())

window()

这是我尝试将文本设置为粗体:

def textBoldAddToDeck(self, eve):
        self.isBoldText = not self.isBoldText
        if self.isBoldText == True:
            self.editFrontTextAddMenu.insertHtml("<b>hi</b>")
        elif self.isBoldText == False:
            self.editFrontTextAddMenu.insertHtml("</b>")
        print(self.isBoldText)

这是完整的代码(我知道变量很长,我很快就会更改它们):

#Import Module
from PyQt5.QtGui import QFont
from PyQt5 import QtWidgets
from PyQt5 import QtCore
from PyQt5.QtCore import Qt
from PyQt5 import QtGui
import sys

class AddToDeckWindow(QtWidgets.QMainWindow):

    def __init__(self):
        super(AddToDeckWindow, self).__init__()

        #Set The UI
        self.initUI()

        #Set The GUI Position And Size
        self.setGeometry(200, 200, 1200, 946)

        #Set The GUI Title
        self.setWindowTitle("Add")

        #Set The GUI Icon
        self.setWindowIcon(QtGui.QIcon('MainFlashcardAppIcon.png'))

        #Set The Translator
        _translate = QtCore.QCoreApplication.translate
        
    def initUI(self):
        widAddToDeckWindow = QtWidgets.QWidget(self)
        self.setCentralWidget(widAddToDeckWindow)

        ###DEFINE IS BOLD VARIABLE###
        self.isBoldText = False
        
        
        #Create A Label
        self.typeLabelAddMenu = QtWidgets.QLabel(self)
        self.typeLabelAddMenu.setText("Type")
        
        font_typeLabelAddMenu = QFont()
        font_typeLabelAddMenu.setPointSize(9)
        
        self.typeLabelAddMenu.setFont(font_typeLabelAddMenu)
        self.typeLabelAddMenu.adjustSize()

        self.typeButtonAddMenu = QtWidgets.QPushButton(self)
        self.typeButtonAddMenu.setText("Basic")
        #self.typeButtonAddMenu.setStyleSheet("background-color: red")

        self.deckLabelAddMenu = QtWidgets.QLabel(self)
        self.deckLabelAddMenu.setText("Deck")

        self.deckLabelAddMenu.setFont(font_typeLabelAddMenu)
        self.deckLabelAddMenu.adjustSize()
        
        self.deckButtonAddMenu = QtWidgets.QPushButton(self)
        self.deckButtonAddMenu.setText("Default")


        vboxAddToDeckWindow_Main = QtWidgets.QVBoxLayout(self)

        hboxAddToDeckWindow_top = QtWidgets.QHBoxLayout()
        hboxAddToDeckWindow_top.setSpacing(27)
        hboxAddToDeckWindow_top.addWidget(self.typeLabelAddMenu)
        hboxAddToDeckWindow_top.addWidget(self.typeButtonAddMenu, 1)
        hboxAddToDeckWindow_top.addWidget(self.deckLabelAddMenu)
        hboxAddToDeckWindow_top.addWidget(self.deckButtonAddMenu, 1)
        hboxAddToDeckWindow_top.setAlignment(Qt.AlignTop)

        font_typeButtonAddMenu_setFont = QFont()
        font_typeButtonAddMenu_setFont.setPointSize(10)

        self.fieldButtonAddMenu_font = QtWidgets.QToolButton(self)
        self.fieldButtonAddMenu_font.setText("Fields...")
        self.fieldButtonAddMenu_font.setFont(font_typeButtonAddMenu_setFont)

        self.cardsButtonAddMenu_font = QtWidgets.QToolButton(self)
        self.cardsButtonAddMenu_font.setText("Cards...")
        self.cardsButtonAddMenu_font.setFont(font_typeButtonAddMenu_setFont)

        #Set Font For The Bold Label Button
        fontAddToDeckBold_setFont = QFont()
        fontAddToDeckBold_setFont.setFamily(u"Corbel")
        fontAddToDeckBold_setFont.setPointSize(19)
        fontAddToDeckBold_setFont.setBold(True)
        fontAddToDeckBold_setFont.setWeight(75)

        #Create The Bold Label Button
        self.textBoldButtonAddMenu_font = QtWidgets.QLabel(self)
        self.textBoldButtonAddMenu_font.setText("B")
        self.textBoldButtonAddMenu_font.setFont(fontAddToDeckBold_setFont)

        #self.textBoldButtonAddMenu_font.mousePressEvent = self.textBoldAddToDeck  ##### CALL THE TEXT BOLD FUNCTION


        #Set Font For The Itallic Label Button
        fontAddToDeckItallic_setFont = QFont()
        fontAddToDeckItallic_setFont.setFamily(u"Corbel")
        fontAddToDeckItallic_setFont.setPointSize(19)
        fontAddToDeckItallic_setFont.setItalic(True)
        fontAddToDeckItallic_setFont.setBold(True)
        fontAddToDeckItallic_setFont.setWeight(75)

        #Create The Itallic Label Button
        self.textItallicButtonAddMenu_font = QtWidgets.QLabel(self)
        self.textItallicButtonAddMenu_font.setText("I")
        self.textItallicButtonAddMenu_font.setFont(fontAddToDeckItallic_setFont)


        #Set Font For The Underline Label Button
        fontAddToDeckUnderline_setFont = QFont()
        fontAddToDeckUnderline_setFont.setFamily(u"Corbel")
        fontAddToDeckUnderline_setFont.setPointSize(19)
        fontAddToDeckUnderline_setFont.setUnderline(True)

        #Create The Underline Label Button
        self.textUnderlineButtonAddMenu_font = QtWidgets.QLabel(self)
        self.textUnderlineButtonAddMenu_font.setText("U")
        self.textUnderlineButtonAddMenu_font.setFont(fontAddToDeckUnderline_setFont)


        #Set Font For The Superscript Label Button
        fontAddToDeckSuper_setFont = QFont()
        fontAddToDeckSuper_setFont.setFamily(u"Corbel")
        fontAddToDeckSuper_setFont.setPointSize(19)

        #Create The Subscript Label Button
        self.textSubButtonAddMenu_font = QtWidgets.QLabel(self)
        self.textSubButtonAddMenu_font.setText("S<sub>2</sub>")
        self.textSubButtonAddMenu_font.setFont(fontAddToDeckSuper_setFont)


        #Create The Superscript Label Button
        self.textSuperButtonAddMenu_font = QtWidgets.QLabel(self)
        self.textSuperButtonAddMenu_font.setText("S<sup>2</sup>")
        self.textSuperButtonAddMenu_font.setFont(fontAddToDeckSuper_setFont)


        #Create The Remove Formatting Label Button
        self.textRemoveFormatButtonAddMenu_font = QtWidgets.QLabel(self)
        self.textRemoveFormatButtonAddMenu_font.setText("F<sub>x</sub>")
        self.textRemoveFormatButtonAddMenu_font.setFont(fontAddToDeckSuper_setFont)


        #Create The Set Colour Label Button
        self.textSetColorButtonAddMenu_font = QtWidgets.QLabel(self)
        self.textSetColorButtonAddMenu_font.setFont(fontAddToDeckSuper_setFont)

        
        self.textSetColorButtonAddMenu_font.setStyleSheet(u"border :1px solid black;\n"
                                                            "border-radius: 15px;\n"
                                                            "background-color: rgb(0, 0, 0);")

        self.textSetColorButtonAddMenu_font.setMinimumSize(QtCore.QSize(40, 40))
        self.textSetColorButtonAddMenu_font.setMaximumSize(QtCore.QSize(40, 40))


        #Create The Choose Colour Label Button
        self.textChooseColorButtonAddMenu_font = QtWidgets.QLabel(self)
        self.textChooseColorButtonAddMenu_font.setFont(fontAddToDeckSuper_setFont)

        
        self.textChooseColorButtonAddMenu_font.setStyleSheet(u"border :1px solid black;\n"
                                                            "border-radius: 15px;\n"
                                                            "background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(255, 0, 0, 255), stop:0.166 rgba(255, 255, 0, 255), stop:0.333 rgba(0, 255, 0, 255), stop:0.5 rgba(0, 255, 255, 255), stop:0.666 rgba(0, 0, 255, 255), stop:0.833 rgba(255, 0, 255, 255), stop:1 rgba(255, 0, 0, 255));")

        self.textChooseColorButtonAddMenu_font.setMinimumSize(QtCore.QSize(40, 40))
        self.textChooseColorButtonAddMenu_font.setMaximumSize(QtCore.QSize(40, 40))

        hboxAddToDeckWindow_setFont = QtWidgets.QHBoxLayout()
        hboxAddToDeckWindow_setFont.setSpacing(16)
        hboxAddToDeckWindow_setFont.addWidget(self.fieldButtonAddMenu_font)
        hboxAddToDeckWindow_setFont.addWidget(self.cardsButtonAddMenu_font)
        hboxAddToDeckWindow_setFont.addStretch()
        hboxAddToDeckWindow_setFont.addWidget(self.textBoldButtonAddMenu_font)
        hboxAddToDeckWindow_setFont.addWidget(self.textItallicButtonAddMenu_font)
        hboxAddToDeckWindow_setFont.addWidget(self.textUnderlineButtonAddMenu_font)
        hboxAddToDeckWindow_setFont.addWidget(self.textSubButtonAddMenu_font)
        hboxAddToDeckWindow_setFont.addWidget(self.textSuperButtonAddMenu_font)
        hboxAddToDeckWindow_setFont.addWidget(self.textRemoveFormatButtonAddMenu_font)
        hboxAddToDeckWindow_setFont.addWidget(self.textSetColorButtonAddMenu_font)
        hboxAddToDeckWindow_setFont.addWidget(self.textChooseColorButtonAddMenu_font)

        hboxAddToDeckWindow_setFont.setAlignment(Qt.AlignTop)
        

        self.editFrontTextAddMenu = QtWidgets.QTextEdit(self)
        self.editFrontTextAddMenu.setMinimumSize(800, 50)

        #Set The Font
        editFrontTextAddMenu_font = QFont()
        editFrontTextAddMenu_font.setPointSize(15)
        self.editFrontTextAddMenu.setFont(editFrontTextAddMenu_font)

        self.editBackTextAddMenu = QtWidgets.QTextEdit(self)
        self.editBackTextAddMenu.setMinimumSize(800, 80)

        #Set The Font

        self.editBackTextAddMenu.setFont(editFrontTextAddMenu_font)

        hboxAddToDeckWindow_editFrontText = QtWidgets.QGridLayout()

        #Create A Label
        self.FrontCardAddWindowLabel = QtWidgets.QLabel(self)
        self.FrontCardAddWindowLabel.setText("Front")
        
        self.FrontCardAddWindowLabel.setFont(font_typeLabelAddMenu)
        self.FrontCardAddWindowLabel.adjustSize()

        #Create A Label
        self.BackCardAddWindowLabel = QtWidgets.QLabel(self)
        self.BackCardAddWindowLabel.setText("Back")
        
        self.BackCardAddWindowLabel.setFont(font_typeLabelAddMenu)
        self.BackCardAddWindowLabel.adjustSize()

        hboxAddToDeckWindow_editFrontText.addWidget(self.FrontCardAddWindowLabel, 1, 1)
        hboxAddToDeckWindow_editFrontText.addWidget(self.editFrontTextAddMenu, 2, 1)
        hboxAddToDeckWindow_editFrontText.addWidget(self.BackCardAddWindowLabel, 3, 1)
        hboxAddToDeckWindow_editFrontText.addWidget(self.editBackTextAddMenu, 4, 1)
        hboxAddToDeckWindow_editFrontText.setColumnStretch(1, 1)
        #hboxAddToDeckWindow_editFrontText.setRowStretch(2, 1)
        #hboxAddToDeckWindow_editFrontText.setRowStretch(14, 14)



        #Add The Horizontal Layouts To A Main Vertical Layout
        vboxAddToDeckWindow_Main.addLayout(hboxAddToDeckWindow_top)
        vboxAddToDeckWindow_Main.addLayout(hboxAddToDeckWindow_setFont)
        vboxAddToDeckWindow_Main.addLayout(hboxAddToDeckWindow_editFrontText)
        vboxAddToDeckWindow_Main.addStretch()
        

        widAddToDeckWindow.setLayout(vboxAddToDeckWindow_Main)

    def textBoldAddToDeck(self, eve):
        self.isBoldText = not self.isBoldText
        if self.isBoldText == True:
            self.editFrontTextAddMenu.insertHtml("<b>")
        elif self.isBoldText == False:
            self.editFrontTextAddMenu.insertHtml("</b>")
        print(self.isBoldText)

#Create A Windows
def window():
    app = QtWidgets.QApplication(sys.argv)
    win = AddToDeckWindow()

    #Centers The Window On The Screen
    qtRectangle = win.frameGeometry()
    centerPoint = QtWidgets.QDesktopWidget().availableGeometry().center()
    qtRectangle.moveCenter(centerPoint)
    win.move(qtRectangle.topLeft())


    win.show()
    sys.exit(app.exec_())

window()

然而,它没有起作用。谁能帮帮我吗


Tags: theimportselfcreatebuttonlabelfontset
1条回答
网友
1楼 · 发布于 2024-10-02 08:19:30

需要记住的一件重要事情是,Qt的富文本功能部分受到限制,并且它们不符合完整HTML标准

使用setHtml()insertHtml()并不完全设置/追加参数中使用的确切html。给定的html被解析为符合Qt的富文本段,然后合并到底层的QTextDocument

如果您尝试打印toHtml()的输出,结果很清楚,这将与您使用的不同。下面是在添加粗体文本之前toHtml()的输出(我跳过了标题):

<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; 
-qt-block-indent:0; text-indent:0px;">not bold</p>

下面是使用insertHtml("<b>bold</b>")之后的内容:

<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; 
-qt-block-indent:0; text-indent:0px;">not bold</p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; 
-qt-block-indent:0; text-indent:0px;">
<span style=" font-weight:600;">bold</span></p>

如您所见,没有<b>标记的痕迹,而是转换为<span>

在您的例子中,发生的是一个简单的<b>被忽略,因为它没有有效的内容:虽然Qt足够聪明,可以关闭保持打开状态的标记,但是没有文本,因此实际上没有向文档添加任何内容

正确的解决方案实际上更简单,因为QTextEdit已经提供了一些函数来更改当前光标位置的格式(如文档的Using QTextEdit as an Editor部分所述),包括^{}

        if self.isBoldText == True:
            self.editFrontTextAddMenu.setFontWeight(QtGui.QFont.Bold)
        elif self.isBoldText == False:
            self.editFrontTextAddMenu.setFontWeight(QtGui.QFont.Normal)

相关问题 更多 >

    热门问题