Реагируйте на изменение размера QmainWindow для отрегулирования размера виджета
-
22-10-2019 - |
Вопрос
Как отреагировать на изменение размера QMainWindow
? У меня есть QTextBrowsers
в QScrollArea
и я настраиваю их до размера контента при их создании (единственное, что должно прокрутить, - это QScrollArea
).
Все работает сейчас, но если я изменю размер mainWindow
, высота QTextBrowsers
не изменяется, потому что функция рефлекса не запускается.
У вас есть лучшая идея, чтобы настроить QTextBrowser
до контента? Мой текущий код:
void RenderFrame::adjustTextBrowser(QTextBrowser* e) const {
e->document()->setTextWidth(e->parentWidget()->width());
e->setMinimumHeight(e->document()->size().toSize().height());
e->setMaximumHeight(e->minimumHeight());
}
А parentWidget()
необходим, потому что бег width()
На самом виджете возвращается всегда 100, независимо от реального размера.
Решение
Если есть только текст или 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();
}
};