我有一个由中央应用程序创建和管理的对话框。对话框在运行时生成小部件,并具有成员函数以将对话恢复为其默认排列,即。顶部的按钮框和底部的单个小部件。隐藏对话时调用此恢复功能。我可以从对话中获取额外的小部件,但我不能让对话本身缩小到它的原始大小。这是我正在使用的代码,名称已被更改为通用。
void Dialogue::restore()
{
const short RESTORE_WIDTH = 800;
const short RESTORE_HEIGHT = 200;
QRect newGeometry(frameGeometry());
// Remove all old origins
foreach(RuntimeWidget* child, findChildren< RuntimeWidget* >())
child->deleteLater();
// Restore widget to default state
newGeometry.setWidth(RESTORE_WIDTH);
newGeometry.setHeight(RESTORE_HEIGHT);
setGeometry(newGeometry);
updateGeometry();
addRuntimeWidget();
}
void Dialogue::addRuntimeWidget()
{
RuntimeWidget* pWidget(new RuntimeWidget());
vbxlytDialogue->addWidget(pWidget);
adjustSize();
adjustPosition(this);
pWidget->setFocus(Qt::OtherFocusReason);
}
答案 0 :(得分:2)
我猜你在这里使用deleteLater
存在问题。只有在您返回主事件循环后才会删除子窗口小部件,并且只有在 restore()
完成后才会被删除(即在您调用adjustSize
之后)
在调用deleteLater()
之前,您是否尝试从他们所处的布局中删除子窗口小部件?
foreach(RuntimeWidget* child, findChildren< RuntimeWidget* >()) {
vbxlytDialogue->removeWidget(child);
child->deleteLater();
}
(或者那种效果 - 我只是猜测vbxlytDialogue
的类型。)