J'écris un traitement de texte personnalisé en tant que projet de loisir. J'utilise python et pyqt6.
J'ai écrit ce qui suit. Le but est que si je sélectionne du texte et applique une mise en forme en gras (par exemple en appuyant sur "ctrl-b"), la mise en forme changera. Plus précisément, si tout le texte sélectionné est en gras, la mise en forme en gras doit être supprimée. Sinon, il appliquera une mise en forme en gras.
class OvidFont: def __init__(self, ovid) -> None: self.textEditor = ovid.textEditor def setBoldText(self) -> None: fmt = QTextCharFormat() if self.textEditor.currentCharFormat().fontWeight() != QFont.Weight.Bold: print(" setting bold") # for debugging fmt.setFontWeight(QFont.Weight.Bold) else: print(" setting normal") # for debugging fmt.setFontWeight(QFont.Weight.Normal) self.textEditor.textCursor().mergeCharFormat(fmt)
Cependant, il ne supprime pas la mise en forme en gras.
Par exemple, dans la phrase « ceci est un test », si je sélectionne « est un » et applique une mise en forme en gras, j'obtiens « ceci est un test » où « est un » est en gras de manière appropriée. Cependant, en sélectionnant Une fois entré. place, si j'appuie sur "ctrl-b", il reste toujours en gras. Si je désélectionne le premier ou le dernier caractère, la bascule en gras fonctionne comme prévu (j'ai essayé d'inverser la logique if/else, mais cela ne fonctionne pas. a également échoué)
Qu'est-ce que j'ai raté ?Mise à jour : j'ai ajouté un cas de test minimal fonctionnel sur https://gist.github.com/ovid/65936985c6838c0220620cf40ba935fa
Vérifiez l'état en gras, cela ne reflète que le formatage du personnage au niveau position actuelle du curseur, plutôt que de formater l'intégralité du texte sélectionné. Si votre curseur se trouve au début ou à la fin de la sélection, il peut ne pas représenter avec précision le formatage de l'ensemble de la sélection. setboldtext
函数的问题在于它使用 self.texteditor.currentcharformat().fontweight()
. setfontweight()
Code mis à jour :
import sys from PyQt6.QtWidgets import QTextEdit, QToolButton, QApplication, QMainWindow, QToolBar from PyQt6.QtGui import QFont, QShortcut, QKeySequence, QTextCharFormat, QTextCursor class OvidFont: def __init__(self, ovid) -> None: self.textEditor = ovid.textEditor def setBoldText(self): cursor = self.textEditor.textCursor() # If there's a selection, and the cursor is not at the block start and at the beginning of the selection, # move the cursor to the end of the selection if cursor.hasSelection() and not cursor.atBlockStart() and cursor.position() == cursor.selectionStart(): cursor.setPosition(cursor.selectionEnd()) # Check if the text (either selected or where the cursor is) is bold is_bold = cursor.charFormat().fontWeight() == QFont.Weight.Bold # Apply the new weight based on the current state new_weight = QFont.Weight.Normal if is_bold else QFont.Weight.Bold self.textEditor.setFontWeight(new_weight) print(f"Bold set to: {'Normal' if is_bold else 'Bold'}") class Ovid(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setWindowTitle("Ovid") self.setGeometry(100, 100, 200, 200) self.textEditor = QTextEdit() self.setCentralWidget(self.textEditor) self.fonts = OvidFont(self) self.toolbar = QToolBar("Main Toolbar") self.addToolBar(self.toolbar) bold_button = QToolButton() bold_button.setText("B") bold_button.setFont(QFont("Arial", 16, QFont.Weight.Bold)) bold_button.setToolTip("Bold") bold_button.clicked.connect(self.fonts.setBoldText) self.toolbar.addWidget(bold_button) QShortcut(QKeySequence("Ctrl+B"), self, self.fonts.setBoldText) def main(): app = QApplication(sys.argv) ex = Ovid() ex.show() sys.exit(app.exec()) if __name__ == "__main__": main()
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!