Как сделать так, чтобы QTextBrowser хорошо масштабировался в QVBoxLayout? - PullRequest
0 голосов
/ 08 апреля 2011

Я хотел бы отобразить список коротких фрагментов HTML в прокручиваемом списке.Таким образом, я помещаю QVboxLayout в QScrollArea и добавляю несколько QTextBrowsers:

#include <QApplication>
#include <QScrollArea>
#include <QTextBrowser>
#include <QVBoxLayout>

int main(int argc, char *argv[]) {
  QApplication app(argc, argv);

  QScrollArea scrollArea;
  scrollArea.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
  scrollArea.setWidgetResizable(true);
  QWidget *scrollWidget = new QWidget;
  QVBoxLayout *layout = new QVBoxLayout;

  for(int i=0;i<6;i++) {
    QString text = "some <b>text</b> ";
    for(int j=0;j<i;j++) text += text;

    QTextBrowser *browser = new QTextBrowser();
    QTextDocument *doc = new QTextDocument(browser);
    doc->setHtml(text);
    browser->setDocument(doc);

    layout->addWidget(browser);
  }

  scrollWidget->setLayout(layout);
  scrollArea.setWidget(scrollWidget);

  scrollArea.show();
  return app.exec();
}

Моя проблема: у всех блоков одинаковый размер.Я хочу, чтобы они были настолько большими, насколько это необходимо, но не больше.Как сделать так, чтобы текстовые браузеры занимали столько места, сколько им действительно нужно?

Ответы [ 2 ]

0 голосов
/ 08 апреля 2011

Хорошо, я нашел решение, полученное из http://www.qtcentre.org/threads/39839-QTextBrowser-height-adjusted-to-content. Есть ли более простое / более элегантное решение?

#include <QApplication>
#include <QScrollArea>
#include <QTextBrowser>
#include <QVBoxLayout>
#include <QGroupBox>
#include <QDebug>

#include <QShowEvent>
#include <QResizeEvent>

class MyBrowser : public QTextBrowser {
private:
  QTextDocument *doc;

public:
  MyBrowser(const QString &text, QWidget *parent = 0) : QTextBrowser(parent) {
    doc = new QTextDocument(this);
    doc->setHtml(text);
    setDocument(doc);
  }

  void adjust() {
    QMargins margins = contentsMargins();

    int width = size().width() - 
      margins.left() - margins.right() - doc->documentMargin()*2;
    doc->setPageSize(QSizeF(width,-1));

    int height = doc->size().height() + margins.top() + margins.bottom();
    setMaximumHeight(height);
    setMinimumHeight(height);
  }

  void showEvent(QShowEvent *) {
    adjust();
  }

  void resizeEvent(QResizeEvent *) {
    adjust();
  }
};

int main(int argc, char *argv[]) {
  QApplication app(argc, argv);

  QScrollArea scrollArea;
  scrollArea.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
  scrollArea.setWidgetResizable(true);
  QWidget *scrollWidget = new QWidget;
  QVBoxLayout *layout = new QVBoxLayout;

  for(int i=0;i<6;i++) {
    QString text = "some <b>text</b> ";
    for(int j=0;j<i;j++) text += text;

    MyBrowser *browser = new MyBrowser(text, scrollWidget);
    layout->addWidget(browser, 0, 0);
  } 

  scrollWidget->setLayout(layout);
  scrollArea.setWidget(scrollWidget);

  scrollArea.show();
  return app.exec();
}
0 голосов
/ 08 апреля 2011

Вместо того, чтобы делать

layout->addWidget(browser);

Вы должны сделать:

layout->addWidget(browser, 0, 0);

Это скажет QT не растягивать виджет в соответствии с его макетом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...