Как сделать не занимающий место текст в QTextBrowser (через свойства ?)

Есть PyQt6 приложение, в нем QTextBrowser.

В него могу добавлять текст, могу изменять размер текста и раскрашивать его, обернув текст в <span class="tech" style="font-size:8pt; color:#0000ff;">.

Так же в него попадает ряд технических сообщений, и есть галочка о том - отображать их или нет.

Возможно ли сделать так, чтобы технические сообщения были частью текста, но не были видны при отключенной галочке? Т.е. что текст в коде есть, и если сделать банальную замену условного "текст:спрятан" на "текст:виден" чтобы оно все становилось видимым. Но притом чтобы когда оно спрятано его было вообще совсем не видно что он когда то там был ("пустые" строки с текстом под цвет фона не пойдут).

Пробовал назначать font-size:0pt и visibility:hidden, но продолжал появляться текст размером ~8pt.

Возможно вопрос даже не про pyqt, а про банальный html.

Upd: display:none !important; тоже не работает как с импортантом так и без.

Upd2: Какую реакцию я хочу увидеть:

  1. галочка стоит, в QTextBrowser содержится:
Строка 1 (сообщение)
Строка 2 (техническое - пропал интернет)
Строка 3 (сообщение)

В коде который лежит в QTextBrowser у меня содержатся все 3 строки.

  1. я снимаю галочку - из того что я вижу пропадает Строка 2, я начинаю видеть:
Строка 1 (сообщение)
Строка 3 (сообщение)

В коде у меня по прежнему лежат все три строки, просто вторая в стилях имеет нулевой размер (font-size:0pt, атрибут display:none или visibility:hidden, или еще как то).

  1. я ставлю галочку обратно - строка 2 появляется на месте.

Строк которые нужно hidden - МНОГО, они разбросаны по всему тексту в QTextBrowser.

Update 3:

Вот - воспроизводимый пример. Тонны кода которые оканчиваются выводом в QTextBrowser сообщений я заменил на 2 кнопки - вывод обычного и технического сообщений. Потыкайте в них сами, раз 20, вперемешку - получится примерно то, что у меня ожидается в этом самом QTextBrowser.

Специально чтобы не было придирок - заменил всю ту логику, которая оканчивается техническим сообщением - на генератор случайных строк - технические сообщения будут разные, однако.

import sys
from PyQt5.Qt import *
import random
import string


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.centralWidget = QWidget()
        self.setCentralWidget(self.centralWidget)

        self.textBrowser = QTextBrowser()

        self.button_norm = QPushButton("Добавить обычное сообщение")
        self.button_norm.clicked.connect(self.button_norm_clicked)

        self.button_tech = QPushButton("Добавить техническое сообщение")
        self.button_tech.clicked.connect(self.button_tech_clicked)

        self.check_box = QCheckBox("Показать технические сообщения")
        self.check_box.setChecked(True)
        self.check_box.stateChanged.connect(self.state_changed)

        self.layout = QGridLayout(self.centralWidget)
        self.layout.addWidget(self.textBrowser)
        self.layout.addWidget(self.button_norm)
        self.layout.addWidget(self.button_tech)
        self.layout.addWidget(self.check_box)

    def button_norm_clicked(self):
        self.textBrowser.insertHtml('<span class="main" style="font-size:15pt; color:#000000;">'
                                    'Это одно из обычных сообщений</span><br>')

    def button_tech_clicked(self):
        all_symbols = string.ascii_uppercase + string.digits
        result = ''.join(random.choice(all_symbols) for _ in range(10))

        # Вот эта часть - не работает!!!
        if self.check_box.isChecked():
            visibility = "visible"
        else:
            visibility = "hidden"
        # вот это - не работает - он не добавляет часть с visibility, либо не отдает ее при .toHtml()

        self.textBrowser.insertHtml(f'<span class="tech" style="visibility:{visibility}; font-size:8pt; color:#0000ff;">'
                                    f'{result}</span><br>')

    def state_changed(self):
        text_from_text_browser = self.textBrowser.toHtml() # Мне нужно получить содержимое
        print(text_from_text_browser) # и я тут же его распечатал чтобы посмотреть чего там вообще есть

# Вот эта часть с replace тоже не работает
        if self.check_box.isChecked():
            text_to_text_browser = text_from_text_browser.replace("visibility:hidden", "visibility:visible")
        else:
            text_to_text_browser = text_from_text_browser.replace("visibility:visible", "visibility:hidden")

        self.textBrowser.clear()
        self.textBrowser.insertHtml(text_to_text_browser)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setFont(QFont("Times", 12, QFont.Bold))
    w = MainWindow()
    w.resize(700, 300)
    w.show()
    sys.exit(app.exec())        

Ах да, вот содержимое print - а где все то, что я прописывал для span за исключением цвета и размера?:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'Times'; font-size:12pt; font-weight:600; font-style:normal;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:15pt; color:#000000;">Это одно из обычных сообщений</span><br /><span style=" font-size:8pt; color:#0000ff;">2NYOWI999Y</span><br /><span style=" font-size:15pt; color:#000000;">Это одно из обычных сообщений</span><br /><span style=" font-size:15pt; color:#000000;">Это одно из обычных сообщений</span><br /><span style=" font-size:8pt; color:#0000ff;">MUZFTXWGIF</span><br /><span style=" font-size:8pt; color:#0000ff;">HYYMDBELVF</span><br /><span style=" font-size:8pt; color:#0000ff;">MHDC05FTME</span><br /></p></body></html>

Ответы (1 шт):

Автор решения: S. Nick

Пожалуйста, ВСЕГДА предоставьте минимальный воспроизводимый пример, который демонстрирует проблему.

Я понял вашу задачу так:

import sys
from PyQt5.Qt import *


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.centralWidget = QWidget()
        self.setCentralWidget(self.centralWidget)
        
        self.textBrowser = QTextBrowser()
        
        self.button = QPushButton("Показать технические сообщения")
        self.button.clicked.connect(self.button_clicked)
        self.button.setCheckable(True)        
        
        self.layout = QGridLayout(self.centralWidget)
        self.layout.addWidget(self.textBrowser)
        self.layout.addWidget(self.button)        
        
        self.button_clicked(False)
        
    def button_clicked(self, state):
        text_1 = ''
        if state:
            text_1 = 'текст: виден' # это одно из ваших технических сообщений
            self.button.setText("Спрятать технические сообщения")

        self.textBrowser.clear()
        self.textBrowser.insertHtml(
            f'В QTextBrowser могу добавлять текст, могу изменять '
            f'<span class="tech" style="font-size: 8pt; color: #0000ff;"> '
            f'размер текста и раскрашивать его, обернув текст в тег span</span><br><br>'
            f'Возможно ли сделать так, чтобы технические сообщения были '
            f'частью текста (<i>{text_1}</i>), но не были видны при отключенной галочке? '
            f'Т.е. что текст в коде можно было показать '
            f'<span style="font-size: 12pt; color: #f00;">{text_1}</span> или спрятать его.'
        )  


if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setFont(QFont("Times", 12, QFont.Bold))
    w = MainWindow()
    w.resize(700, 300)
    w.show()
    sys.exit(app.exec())        

введите сюда описание изображения

введите сюда описание изображения

→ Ссылка