对QMainWindow的大小调整做出反应,以调整小部件的大小

时间:2011-09-04 20:01:28

标签: qt resize signals-slots autosize qmainwindow

如何对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。

1 个答案:

答案 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();
    }
};