【问题标题】:Resizing qt widgets when their children are hidden隐藏孩子时调整 qt 小部件的大小
【发布时间】:2011-01-28 23:27:36
【问题描述】:

当重试子项被隐藏时,我将如何调整小部件的大小以使其看起来与第一张图片一样?主布局是 QVBoxLayout,重试子布局也是一个带有 QVBoxLayout 的小部件。

我尝试了以下方法:

  • 更新()
  • updateGeometry()
  • setGeometry(childrenRect())
  • 布局()->激活()

一旦我将重试小部件设置为隐藏,就在主小部件上。我需要拦截一些事件吗?

【问题讨论】:

  • 您最好启用/禁用按钮而不是隐藏/显示它们。恕我直言,这将是一种不那么令人惊讶的行为,并且可以避免您在这里遇到的那种问题。另一种选择是在完全独立的对话框中显示按钮。
  • @Steve S 它原本是一个单独的对话框,但看起来太奇怪了;不幸的是,如果没有重试,这些按钮就没有任何意义,所以它们必须被隐藏。
  • 该图像不再可用。

标签: qt resize qwidget


【解决方案1】:

如果您希望在设置 QLayout::SetFixedSize 后调整小部件的大小,您还需要覆盖 QWidget::resizeEvent()

void resizeEvent(QResizeEvent* event) override {
    QWidget::resizeEvent(event);
    layout()->setSizeConstraint(QLayout::SetMinAndMaxSize);
};

【讨论】:

    【解决方案2】:

    adjustSize 函数可以做你想做的事。

    【讨论】:

    • 对我有用的是将主布局的 sizeConstraint 设置为 QLayout::SetFixedSize。也就是说,mainLayout->setSizeConstraint(QLayout::SetFixedSize);
    【解决方案3】:

    这是一个在小部件隐藏/显示时自动调整大小的基本示例。

    dialog.h 文件:

    #ifndef DIALOG_H
    #define DIALOG_H
    
    #include <QDialog>
    #include <QtGui>
    
    class dialog : public QDialog
    {
        Q_OBJECT
    
    
    public:
        explicit dialog(QWidget *parent = 0)
        {
    
            vlayout.addWidget(&checkbox);
            vlayout.addWidget(&label);
            label.setText("Label");
    
            setLayout(&vlayout);
            this->layout()->setSizeConstraint(QLayout::SetFixedSize); // !!! This is the what makes it auto-resize
    
            checkbox.setChecked(true);
            connect(&checkbox,SIGNAL(toggled(bool)),&label,SLOT(setVisible(bool)));
        }
    
    private:
        QVBoxLayout vlayout;
        QCheckBox checkbox;
        QLabel label;
    
    };
    
    #endif // DIALOG_H
    

    和main.c

    #include <QApplication>
    #include "dialog.h"
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        dialog d;
        d.show();
        return a.exec();
    }
    

    【讨论】:

    • setSizeConstraint(QLayout::SetFixedSize) 为我做的
    【解决方案4】:

    这是我刚刚开发的答案!!! (注意:这将以 PyQt4 形式给出)

    我需要能够在显示和隐藏额外面板时重新调整我的应用程序窗口的大小。 然而在过去,我最终只是重新配置了 UI 和/或工作流程,因此不需要重新调整窗口大小。但是现在它是必须的。

    窗口可以在创建过程中调整大小。窗口可以直接调整大小(例如 self.resize( xSize, ySize ) 但是,如果您创建一些代码行来捕获所需的大小、隐藏所需的部分、重新计算大小应该是多少,那么似乎根本不需要重新调整大小。

    (示例)

    curHgt = self.size().height()
    curWth = self.size().width()
    myFrmHgt = self.ui.reviewFrm.size().height()
    self.ui.reviewFrm.hide()
    self.resize( curWth, (curHgt - myFrmHgt ) )
    

    什么都没有。不工作。为什么不呢?

    今天的寻找答案仍然没有找到可行的答案。有多种选择。查找小部件层次结构、无效、调整大小。如果您尝试重新调整主窗口的大小,那么一个相当详尽的布局抖动将无法正常工作。还有一个压倒性的回应说将您的约束设置为 FixedSize。但这反而违背了整个目的,有点像说如果你有一个挂钉子,就把你的手从手腕上割下来。

    但是,我确实偶然发现有人在挖掘方面取得了一些成功,并发现调整大小没有生效的原因是由于发布事件队列将重置调整大小。

    他的解决方案是在重新调整应用程序大小之前运行 QApplication.sendPostedEvents(),这样排队的事件就不会重置您的窗口。 是的,不。 是的,这就是解决方案,我相信有一种更漂亮的方法,但你需要先像洗过的油漆滚筒一样把队列摇出来。

    这是我设置的简单 sn-p,到目前为止似乎很可靠。

    result = [ self.size().width(), self.size().height() ]
    if self.ui.reviewFrm.isVisible():
        result[1] -= self.ui.reviewFrm.size().height()
        self.ui.reviewFrm.hide()
    
        while self.size().height() > result[1]:
            self.appy.sendPostedEvents()
            self.resize( result[0], result[1] )
    

    不。它不漂亮。但是,在发布的事件允许窗口调整大小之前,我最多只看到它晃动油漆滚筒两次。 无需锁定约束或摇动父小部件或爬过层次结构寻找尺寸提示。

    【讨论】:

      【解决方案5】:

      我的问题有点不同,因为我有一个在布局中有子级的顶级 QWidget(而不是 QDialog 或 QMainWindow)。当这些孩子调整到更大时,QWidget 会调整大小以适应,但当他们变得更小时不会。就像上面一样,该区域只有空的空间。我终于找到了解决办法:

      我的 QWidget 中使用的布局有一个名为 setSizeConstraint() 的属性。这通常设置为“QLayout::SetDefaultConstraint”,它只会影响拥有它的 QWidget 的“minimumSize”。相反,我选择了“QLayout::SetFixedSize”,它使布局调整了拥有 QWidget 的固定大小,在需要时有效地使其更小。

      【讨论】: