Реагируйте на изменение размера QmainWindow для отрегулирования размера виджета

StackOverflow https://stackoverflow.com/questions/7301785

Вопрос

Как отреагировать на изменение размера 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();
    }
};
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top