Qt - 更改QWidget布局

8

假设我们有一个名为general_layoutQLayout,其中包含其他小部件和布局,还有一个QWidget。像这样将general_layout设置为QWidget的布局:

setLayout(general_layout)

现在我需要改变 QWidget 的内容。我该怎么做?我尝试删除并创建一个新的 QWidget 布局,并将其设置为 QWidget 的布局,但无法成功实现我的意图。

这是我的代码:

delete general_layout;
general_layout = new QHBoxLayout;
general_layout->addLayout(some_layout);
myQWidget->setLayout(general_layout);

你能更具体地描述一下你的问题吗?你所做的似乎是正确的(即在设置新布局之前删除旧布局)。 - mtvec
当然!我会执行以下操作:delete general_layout; general_layout = new QHBoxLayout; general_layout->addLayout(some_layout); myQWidget->setLayout(general_layout); - Narek
1个回答

15

问题是在删除布局(layout)时,其中的部件(widgets)并未被销毁。这导致我的QWidget的所有子部件仍然存在,尽管没有了布局。

解决方案很简单:添加一个

qDeleteAll(myQWidget->children());

之后

delete general_layout;

似乎那就是问题所在。非常感谢!!!还有一个问题。我想要一个对话框,可以改变其结构(在这个问题的方面)。所以我通过创建布局、删除和创建新的布局来实现。这是一个好方法吗? - Narek
4
如果您不再需要第一种结构,那么可以采用这个方法。但如果您需要它,请使用QStackedLayout(http://doc.trolltech.com/latest/qstackedlayout.html),这样会更容易些。 如果您想要实现像向导一样的东西,请查看QWizard(http://doc.trolltech.com/latest/qwizard.html)。 - mtvec
qDeleteAll(myQWidget->children()); 函数删除所有子项,但是子项的子项呢?我的QWidget元素中没有作为general_layout子布局的布局。当我调用general_layout的子布局的方法时,我的应用程序崩溃了(所以我猜测指针被销毁了),但是当我检查它是否等于0(m_childLayout_of_General_Layout == 0)时,if语句被忽略了。这是怎么回事?它被删除了还是没有? - Narek
1
是的,所有子对象(直接或间接)都被删除了(请参阅http://doc.qt.nokia.com/latest/qobject.html#dtor.QObject)。 在C++中,调用指针上的delete操作并不会将该指针设置为0。这就是为什么您的if语句无法工作的原因。 正如我之前所说,如果您仍然需要旧小部件,则使用QStackedLayout可能是解决方法。 - mtvec
也许你应该将子小部件作为其所在布局的子元素,而不是它们的逻辑祖先? - Troyseph

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