当重试子项被隐藏时,我将如何调整小部件的大小以使其看起来像第一张图像?主布局是 QVBoxLayout,重试子布局也是带有 QVBoxLayout 的小部件。
我尝试了以下方法:
- 更新()
- 更新几何()
- setGeometry(childrenRect())
- 布局()->激活()
一旦我将重试小部件设置为隐藏,就在主小部件上。我需要拦截一些事件来做到这一点吗?
该adjustSize
功能可以做你想做的事。
这是一个基本示例,它在小部件隐藏/显示时自动调整大小。
对话框.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();
}
我的问题有点不同,因为我有一个在布局中有子级的顶级 QWidget(而不是 QDialog 或 QMainWindow)。当这些孩子调整为更大时,QWidget 将调整大小以适应,但当他们变得更小时不会。就像上面一样,该区域只有空的空间。我终于找到了解决方案:
我的 QWidget 中使用的布局有一个名为 setSizeConstraint() 的属性。这通常设置为“QLayout::SetDefaultConstraint”,它只会影响拥有它的 QWidget 的“minimumSize”。相反,我选择了“QLayout::SetFixedSize”,它使布局调整拥有 QWidget 的固定大小,在需要时有效地使其更小。
这是我刚刚制定的答案!!!(注意:这将以 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(),这样排队的事件就不会重置您的窗口。是的,也不是。是的,这就是解决方案,我相信有一种更漂亮的方法可以做到这一点,但你需要先像洗过的油漆滚筒一样真正把队列摇出来。
这是我设置的简单片段,到目前为止似乎很可靠。
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] )
没有。它不漂亮。但是,在发布的事件允许窗口调整大小之前,我最多只看到它晃动油漆滚筒两次。无需锁定约束或摇动父小部件或爬过层次结构寻找尺寸提示。
如果您希望您的小部件在设置后可调整大小,QLayout::SetFixedSize
您还需要覆盖QWidget::resizeEvent()
.
void resizeEvent(QResizeEvent* event) override {
QWidget::resizeEvent(event);
layout()->setSizeConstraint(QLayout::SetMinAndMaxSize);
};