我在How to make an expandable/collapsable section widget in Qt上看到了这个帖子的答案,但提出的解决方案并非没有缺陷。
事实上,正如你在下面看到的,一旦小部件被展开和关闭,它不会重置窗口大小,这会产生创建空白空间的效果:
下面是一个可复制的最小示例(您需要从帖子答案中导入剧透部件):
QApplication a(argc, argv);
QWidget* widget = new QWidget();
widget->setFixedWidth(500);
QVBoxLayout* mainLayout = new QVBoxLayout(widget);
QFrame* widgetTop = new QFrame();
widgetTop->setFrameShape(QFrame::StyledPanel);
widgetTop->setFixedHeight(50);
QHBoxLayout* layoutTop = new QHBoxLayout(widgetTop);
QLabel* labelTop = new QLabel("widget-top");
labelTop->setAlignment(Qt::AlignCenter);
layoutTop->addWidget(labelTop);
mainLayout->addWidget(widgetTop);
QFrame* widgetMiddle = new QFrame();
widgetMiddle->setFrameShape(QFrame::StyledPanel);
widgetMiddle->setFixedHeight(150);
QHBoxLayout* layoutMiddle = new QHBoxLayout(widgetMiddle);
QLabel* labelMiddle = new QLabel("widget-middle");
labelMiddle->setAlignment(Qt::AlignCenter);
layoutMiddle->addWidget(labelMiddle);
mainLayout->addWidget(widgetMiddle);
QFrame* widgetBottom = new QFrame();
widgetBottom->setFrameShape(QFrame::StyledPanel);
widgetBottom->setFixedHeight(100);
QHBoxLayout* layoutBottom = new QHBoxLayout(widgetBottom);
QLabel* labelBottom = new QLabel("widget-bottom");
labelBottom->setAlignment(Qt::AlignCenter);
layoutBottom->addWidget(labelBottom);
auto* anyLayout = new QVBoxLayout();
anyLayout->addWidget(widgetBottom);
Spoiler* spoiler = new Spoiler("I'm buggy", 100);
spoiler->setContentLayout(*anyLayout);
mainLayout->addWidget(spoiler);
// Affichage du widget principal
widget->show();
return a.exec();
我尝试使用adjustSize()
,但它不适用于QPropertyAnimation
。
如何让Windows恢复到原来的高度?
1条答案
按热度按时间sxissh061#
下面是我对
Spoiler
所做的一些修改来处理这个问题,你必须让你的窗口成为spoiler
的父部件:添加更多成员:
在ctor中所做的更改:
调整事件大小:
以下是它第一眼的样子:
但是如果你通过快速点击它来强调它,它就会表现得不正常:
resize事件被调用的次数太快是背后的原因,但我不知 prop 体是怎么回事。
我确实尝试过对父部件大小进行动画处理,但它比这个解决方案更难看,可能是因为我无法确定开始值和结束值。
我提供这个更多的是为了帮助识别问题并提出处理问题的方法,我认为不应该使用这个解决方案,除非你能让它为你的用例工作。