当Qt小部件的子元素被隐藏时调整其大小

15

当retry子项隐藏时,我该如何调整小部件的大小,使其看起来像第一张图片?主布局是QVBoxLayout,retry子项也是一个带有QVBoxLayout的小部件。

我尝试了以下:

  • update()
  • updateGeometry()
  • setGeometry(childrenRect())
  • layout()->activate()

在将retry小部件设置为隐藏后,立即在主小部件上执行上述操作。我需要拦截某些事件来实现这个吗?


你最好启用/禁用按钮而不是隐藏/显示它们。在我看来,这将是一种较少令人惊讶的行为,并且可以避免你在此处遇到的问题。另一个选择是在完全分离的对话框中显示按钮。 - Steve S
@Steve S,它最初是一个单独的对话框,但那看起来太奇怪了;如果没有重试,这些按钮不幸地就没有意义,因此必须隐藏它们。 - laura
该图片不再可用。 - Trilarion
5个回答

21

2
对我有效的方法是将主布局的sizeConstraint设置为QLayout::SetFixedSize。换句话说,mainLayout->setSizeConstraint(QLayout::SetFixedSize); - user929404
链接已失效,这是一个更新的链接:QWidget::adjustSize - Abderrahmene Rayene Mihoub
链接失效了,这是一个更新的链接 QWidget::adjustSize - undefined

8
这里有一个基本示例,它会在小部件隐藏/显示时自动调整大小。
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();
}

1
setSizeConstraint(QLayout::SetFixedSize) 对我很有帮助。 - Pankrates

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。但这有点失去了整个目的,就像说如果你有一个卡住的指甲,就把手腕砍下来一样。

然而,我偶然发现一个人通过挖掘并发现重新调整大小不起作用的原因是由于排队的Posted Events(发布事件)队列会重置调整大小。

他的解决方案是在执行应用程序重新调整大小之前运行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] )

不是很美观。但是在我最多只看到它抖动了油漆辊两次之前,发布的事件允许窗口调整大小。 无需锁定约束或抖动父部件或爬遍层次结构以寻找大小提示。


4

我的问题与其他人略有不同,我有一个顶层QWidget(而不是QDialog或QMainWindow),其中包含一个布局中的子元素。当这些子元素调整大小变得更大时,QWidget会调整大小以适应,但是当它们变小时就不会了。与上述情况类似,该区域只有空白区域。最终我找到了一个解决方案:

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


0

如果您想在设置QLayout::SetFixedSize后使您的小部件可调整大小,您还需要重写QWidget::resizeEvent()

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接