Как сделать не занимающий место текст в 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: Какую реакцию я хочу увидеть:
- галочка стоит, в
QTextBrowser
содержится:
Строка 1 (сообщение)
Строка 2 (техническое - пропал интернет)
Строка 3 (сообщение)
В коде который лежит в QTextBrowser
у меня содержатся все 3 строки.
- я снимаю галочку - из того что я вижу пропадает
Строка 2
, я начинаю видеть:
Строка 1 (сообщение)
Строка 3 (сообщение)
В коде у меня по прежнему лежат все три строки, просто вторая в стилях имеет нулевой размер (font-size:0pt
, атрибут display:none
или visibility:hidden
, или еще как то).
- я ставлю галочку обратно - строка 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 шт):
Пожалуйста, ВСЕГДА предоставьте минимальный воспроизводимый пример, который демонстрирует проблему.
Я понял вашу задачу так:
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())