Если есть только текст или html, вы можете использовать вместо него QLabel
, поскольку он уже адаптирует свой размер к доступному пространству. Вам придется использовать:
label->setWordWrap(true);
label->setTextInteractionFlags(Qt::TextBrowserInteraction);
чтобы иметь почти такое же поведение, как QTextBrowser
.
Если вы действительно хотите использовать QTextBrowser
, вы можете попробовать что-то вроде этого (адаптировано из QLabel
исходного кода):
class TextBrowser : public QTextBrowser {
Q_OBJECT
public:
explicit TextBrowser(QWidget *parent) : QTextBrowser(parent) {
// updateGeometry should be called whenever the size changes
// and the size changes when the document changes
connect(this, SIGNAL(textChanged()), SLOT(onTextChanged()));
QSizePolicy policy = sizePolicy();
// Obvious enough ?
policy.setHeightForWidth(true);
setSizePolicy(policy);
}
int heightForWidth(int width) const {
int left, top, right, bottom;
getContentsMargins(&left, &top, &right, &bottom);
QSize margins(left + right, top + bottom);
// As working on the real document seems to cause infinite recursion,
// we create a clone to calculate the width
QScopedPointer<QTextDocument> tempDoc(document()->clone());
tempDoc->setTextWidth(width - margins.width());
return qMax(tempDoc->size().toSize().height() + margins.height(),
minimumHeight());
}
private slots:
void onTextChanged() {
updateGeometry();
}
};