réagir sur le redimensionnement d'un QMainWindow pour ajuster la taille du widget de
-
22-10-2019 - |
Question
Comment puis-je réagis sur le redimensionnement d'un QMainWindow
? Je QTextBrowsers
dans un QScrollArea
et je les ajuster à la taille du contenu de leur création (la seule chose qui doit défiler est le QScrollArea
).
Tout fonctionne pour l'instant, mais si je le remets à la côte mainWindow
, la hauteur du QTextBrowsers
ne change pas, parce que la fonction de refusion ne se déclenche pas.
Avez-vous une meilleure idée de régler un QTextBrowser
au contenu de ce? Mon code actuel est:
void RenderFrame::adjustTextBrowser(QTextBrowser* e) const {
e->document()->setTextWidth(e->parentWidget()->width());
e->setMinimumHeight(e->document()->size().toSize().height());
e->setMaximumHeight(e->minimumHeight());
}
Le parentWidget()
est nécessaire, car l'exécution width()
sur le widget se retourne toujours 100, quelle que soit la taille réelle.
La solution
S'il n'y a que du texte ou html, vous pouvez utiliser QLabel
à la place, car il adapte déjà sa taille à l'espace disponible. Vous devrez utiliser:
label->setWordWrap(true);
label->setTextInteractionFlags(Qt::TextBrowserInteraction);
pour avoir à peu près le même comportement comme QTextBrowser
.
Si vous voulez vraiment utiliser un QTextBrowser
, vous pouvez essayer quelque chose comme ça (adapté à partir du code source 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();
}
};