如何对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。
答案 0 :(得分:2)
如果只有text或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();
}
};