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

Posted

技术标签:

【中文标题】对 QMainWindow 的大小调整做出反应以调整小部件的大小【英文标题】:react on the resizing of a QMainWindow for adjust widget's size 【发布时间】:2011-09-04 20:01:28 【问题描述】:

我对@9​​87654321@ 的大小调整有何反应?我在QScrollArea 中有QTextBrowsers,我在创建它们时将它们调整为内容的大小(唯一应该滚动的是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,无论实际大小如何。

【问题讨论】:

调整小部件大小的标准方法是将它们放在适当配置的布局中。 但是没有办法让QtextBrowser自动调整到不需要滚动条的最小尺寸 【参考方案1】:

如果只有文本或 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();
    
;

【讨论】:

以上是关于对 QMainWindow 的大小调整做出反应以调整小部件的大小的主要内容,如果未能解决你的问题,请参考以下文章

根据 QMainWindow 的大小调整 QWebView 和 QMessagebox 的大小

如何将 QMainWindow 调整大小事件传递给 QMainWindow 中包含的 QGLWidget?

Qt:为啥在 QMainWindow 中添加状态栏会影响大小调整?

如何对 UIView 上的自动布局约束引起的大小变化做出反应?

与 QMainWindow 的 GUI 命令交互时,QDockWidget 无法正确调整大小

如何调整 QMainWindow 的大小以适合具有 setVerticalHeaderLabels 的 QTableWidget