#include "CollapsibleSection.h" #include #include #include #include CollapsibleSection::CollapsibleSection( const QString &title, const QString &markdownContent, QWidget *parent, const bool expanded ): QWidget(parent) { // Кнопка заголовка с стрелкой m_toggleButton = new QToolButton(this); m_toggleButton->setText(title); m_toggleButton->setCheckable(true); m_toggleButton->setChecked(expanded); m_toggleButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); m_toggleButton->setArrowType(expanded ? Qt::DownArrow : Qt::RightArrow); connect(m_toggleButton, &QToolButton::toggled, this, &CollapsibleSection::onToggled); // Контент без собственного скрола, займёт доступное пространство m_contentBrowser = new QTextBrowser(this); m_contentBrowser->setMarkdown(markdownContent); m_contentBrowser->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); m_contentBrowser->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); m_contentBrowser->setFrameShape(QFrame::NoFrame); m_contentBrowser->setVisible(expanded); m_contentBrowser->document()->adjustSize(); // после создания textBrowser: m_contentBrowser->setReadOnly(true); // 1) Отключаем встроенные переходы m_contentBrowser->setOpenLinks(false); // 2) Подключаемся к клику по ссылке connect(m_contentBrowser, &QTextBrowser::anchorClicked, this, [](const QUrl &url) { QDesktopServices::openUrl(url); }); m_contentBrowser->setStyleSheet( "QTextBrowser {" " border: 1px solid #ccc;" // рамка (по желанию) " border-radius: 3px;" // радиус скругления " background-color: white;" // фон (по желанию) "}" ); updateContentHeight(); m_contentBrowser->viewport()->installEventFilter(this); // Компоновка auto *layout = new QVBoxLayout(this); layout->setSpacing(0); layout->setContentsMargins(0, 0, 0, 0); layout->addWidget(m_toggleButton); layout->addSpacing(5); layout->addWidget(m_contentBrowser); } // Перестраховка: запрещаем прокрутку колесом bool CollapsibleSection::eventFilter(QObject *watched, QEvent *event) { if (watched == m_contentBrowser->viewport() && event->type() == QEvent::Resize) { updateContentHeight(); } return QWidget::eventFilter(watched, event); } void CollapsibleSection::updateContentHeight() const { const qreal w = m_contentBrowser->viewport()->width(); m_contentBrowser->document()->setTextWidth(w); const qreal h = m_contentBrowser->document()->size().height(); // Можно добавить +1 пиксел на погрешность: m_contentBrowser->setFixedHeight(static_cast(h) + 5); } void CollapsibleSection::onToggled(const bool checked) const { m_toggleButton->setArrowType(checked ? Qt::DownArrow : Qt::RightArrow); m_contentBrowser->setVisible(checked); if (checked) { updateContentHeight(); } }