Utilisez PyQt6 pour changer de format de caractères

PHPz
Libérer: 2024-02-09 18:57:03
avant
681 Les gens l'ont consulté

使用 PyQt6 切换字符格式

Contenu de la question

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)
Copier après la connexion

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


Réponse correcte


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

J'ai donc utilisé le curseur existant et l'ai ajusté au besoin pour vérifier la mise en forme et appliquer la nouvelle épaisseur de police directement sur le

. setfontweight()

Maintenant, ça ressemble à ceci :

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()
Copier après la connexion

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!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal