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

隐藏子部件时调整qt小部件的大小,qt,resize,qwidget,Qt,Resize,Qwidget,当重试子项被隐藏时,我将如何调整小部件的大小,使其看起来与第一个图像中的一样?主布局是QVBoxLayout,重试子布局也是一个带有QVBoxLayout的小部件 我尝试了以下方法: 更新() 更新计量学() setGeometry(childrenRect()) 布局()->激活() 在我将重试小部件设置为隐藏后,立即打开主小部件。我需要截取一些事件来执行此操作吗?该函数可能会执行您想要的操作。我的问题有点不同,因为我有一个顶级QWidget(而不是QDialog或QMainWindow)

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

我尝试了以下方法:

  • 更新()
  • 更新计量学()
  • setGeometry(childrenRect())
  • 布局()->激活()

在我将重试小部件设置为隐藏后,立即打开主小部件。我需要截取一些事件来执行此操作吗?

该函数可能会执行您想要的操作。

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


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

这是我刚刚开发的答案!!!(注:这将以PyQt4格式提供)

我需要在显示和隐藏额外面板时重新调整应用程序窗口的大小。 然而,在过去,我只是重新配置UI和/或工作流程,这样就不需要重新调整窗口大小。然而,现在这是必须的

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

(示例)

没什么,不行,为什么不行

今天对答案的搜索仍然没有找到一个可行的答案。有几个选项。搜索小部件层次结构,失效,调整大小。如果你试图重新调整主窗口的大小,一个相当详尽的布局震动将不起作用。也有一个压倒性的回应说设置你r限制为固定尺寸。但这恰恰违背了整个目的,有点像说,如果你有一个挂着的指甲,就从手腕上砍掉你的手

然而,我确实偶然发现有人在挖掘方面取得了一些成功,并发现重新调整大小没有占据主导地位的原因是发布的事件队列将重新调整大小

他的解决方案是在应用程序重新调整大小之前运行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] )
不。它不漂亮。不过,在发布事件允许调整窗口大小之前,我最多只见过它摇晃油漆辊两次。
无需锁定约束或抖动父窗口小部件,也无需在层次结构中查找大小提示。

下面是一个基本示例,它可以在窗口小部件隐藏/显示时自动调整大小

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
\ifndef对话框
#定义对话框
#包括
#包括
类对话框:公共QDialog
{
Q_对象
公众:
显式对话框(QWidget*parent=0)
{
vlayout.addWidget(&checkbox);
vlayout.addWidget(&label);
label.setText(“label”);
设置布局(&vlayout);
此->布局()->setSizeConstraint(QLayout::SetFixedSize);/!!!这就是它自动调整大小的原因
checkbox.setChecked(true);
连接(&复选框,信号(切换(bool)),&标签,插槽(设置可见(bool));
}
私人:
QVBoxLayout;
QCheckBox复选框;
QLabel标签;
};
#endif//对话框
和main.c

#include <QApplication>
#include "dialog.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    dialog d;
    d.show();
    return a.exec();
}
#包括
#包括“dialog.h”
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
对话d;
d、 show();
返回a.exec();
}

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


您最好启用/禁用按钮,而不是隐藏/显示按钮。我想这是一个不太令人惊讶的行为,它可以避免您在这里遇到的问题。另一种选择是在一个完全独立的对话框上显示按钮。@Steve S这本来是一个独立的对话框,但看起来太奇怪了;th不幸的是,如果没有重试,e按钮就没有意义,因此它们必须隐藏。图像不再可用。对我来说,有效的方法是将主布局的sizeConstraint设置为QLayout::SetFixedSize。换句话说,mainLayout->SetIzeConstraint(QLayout::SetFixedSize);
SetIzeConstraint(QLayout::SetFixedSize)
是为我做的
#include <QApplication>
#include "dialog.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    dialog d;
    d.show();
    return a.exec();
}
void resizeEvent(QResizeEvent* event) override {
    QWidget::resizeEvent(event);
    layout()->setSizeConstraint(QLayout::SetMinAndMaxSize);
};