Qt доступ к форматированию ExtraSelection (тестирование) - PullRequest
0 голосов
/ 10 марта 2020

Я пытаюсь проверить мою функцию highlight_word (ниже). Однако я не могу понять, как получить доступ к форматированию. По сути, я просто хочу показать, что это не по умолчанию. Я пытался QPlainTextEdit.extraSelections(), но это, очевидно, относится к разрушенным объектам. Я также попытался QTextCursor.charFormat().background.color() с соответствующим образом расположенным курсором, но только когда-либо получаю rgbf(0,0,0,1).

    def highlight_word(self, cursor: QTextCursor):
        selection = QTextEdit.ExtraSelection()
        color = QColor(Qt.yellow).lighter()
        selection.format.setBackground(color)
        selection.cursor = cursor
        self.setExtraSelections([selection])

ОБНОВЛЕНИЕ

Во-первых, я использую PySide2, если это влияет на дальнейшие действия.

Принятое решение работает. Моя проблема была в том, что я писал self.editor.extraSelections()[0].format.background().color().getRgb(), что приводит к RuntimeError: Internal C++ object (PySide2.QtGui.QTextCharFormat) already deleted.. Это кажется мне странным.

1 Ответ

1 голос
/ 10 марта 2020

QTextCursor.charFormat().background().color() не возвращает цвет, потому что QTextCharFormat применяется к QTextEdit.ExtraSelection. Вы можете добавить строку selection.cursor.setCharFormat(selection.format), но это не обязательно. Это должно работать, если вы просто получаете доступ к выбору из extraSelections() и получаете формат выбора.

Вот пример, выделите слово, а затем нажмите кнопку «Выделить», он напечатает фон RGBA. После нажатия кнопки «Получить выделение» будет напечатано выделенное слово и цвет фона.

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *

class Template(QWidget):

    def __init__(self):
        super().__init__()
        self.textbox = QPlainTextEdit()
        btn = QPushButton('Highlight')
        btn.clicked.connect(self.highlight_word)
        btn2 = QPushButton('Get Selection')
        btn2.clicked.connect(self.get_selections)
        grid = QGridLayout(self)
        grid.addWidget(btn, 0, 0)
        grid.addWidget(btn2, 0, 1)
        grid.addWidget(self.textbox, 1, 0, 1, 2)

    def highlight_word(self):
        selection = QTextEdit.ExtraSelection()
        color = QColor(Qt.yellow).lighter()
        selection.format.setBackground(color)
        selection.cursor = self.textbox.textCursor()
        self.textbox.setExtraSelections([selection])
        print(selection.format.background().color().getRgb())

    def get_selections(self):
        selection = self.textbox.extraSelections()[0]
        print(selection.cursor.selectedText(), selection.format.background().color().getRgb())


if __name__ == '__main__':
    app = QApplication(sys.argv)
    gui = Template()
    gui.show()
    sys.exit(app.exec_())
...