在隐藏子项时调整qt小部件的大小

时间:2010-03-18 10:54:52

标签: qt resize qwidget

如果隐藏重试子项以使其看起来像第一张图像中,我将如何调整窗口小部件的大小?主要布局是QVBoxLayout,重试子节点也是一个带有QVBoxLayout的小部件。

我尝试了以下内容:

  • 更新()
  • updateGeometry()
  • setGeometry(childrenRect())
  • 布局() - >激活()
一旦我将重试小部件设置为隐藏,就在主小部件上

。我是否需要截取某些事件才能执行此操作?

5 个答案:

答案 0 :(得分:16)

adjustSize功能可以做你想要的。

答案 1 :(得分:6)

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

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

答案 2 :(得分: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 ) )

无。不行。为什么不呢?

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

然而,我偶然发现了一些成功挖掘并发现重新调整大小的原因是因为发布事件的队列会重置调整大小。

他的解决方案是在执行应用程序重新调整大小之前运行QApplication.sendPostedEvents(),以便排队的事件不会重置窗口。 是的,没有。 是的,这是解决方案,而且我确信有一种更漂亮的方法可以做到这一点,但是你需要先像清洗油漆滚筒那样彻底摆脱排队。

这是我设置的简单片段,到目前为止似乎很稳固。

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] )

不。它不漂亮。然而,最多我只看到它在发布事件允许窗口调整大小之前两次摇动油漆滚筒。 无需锁定约束或摇动父窗口小部件或浏览层次结构以查找大小提示。

答案 3 :(得分:3)

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

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

答案 4 :(得分:0)

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

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