gpt4 book ai didi

c++ - 如何更改/交换小部件的布局?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:02:04 24 4
gpt4 key购买 nike

我正在开发一个应用程序,我需要在按下单选按钮时更改当前选项卡的布局。

我正在使用以下代码来交换布局:

changed_layout = new QVBoxLayout;
label1 = new QLabel(string);
delete main_layout;
changed_layout->addWidget(label1);
setLayout(changed_layout);

但是当我点击按钮时,软件退出(崩溃)。

最佳答案

您不应该尝试使用delete 直接删除QObjects,调用ojbect->deleteLater() 并将您的指针设置为。 Qt 框架将在退出任何槽且控制返回到事件循环后安全地删除该对象。

在您的代码中,将 delete main_layout; 行更改为:

main_layout->deleteLater();
main_layout = NULL;

更新:Steve S 的评论是正确的。为 setLayout()..

引用 Qt 文档

If there already is a layout manager installed on this widget, QWidget won't let you install another. You must first delete the existing layout manager (returned by layout()) before you can call setLayout() with the new layout.layout.

由于 setLayout() 是重新设置小部件父级的特例,我们必须先删除旧布局,然后再设置新布局。我们必须非常确定我们在调用 delete() 时所在的信号/槽调用堆栈。

另一种方法是尽可能多地设置新布局,然后将插槽连接到旧布局 destroyed() 信号,然后调用 deleteLater()它。在 destroyed() 信号的插槽中,您应该能够使用新布局调用 setLayout()

如果这听起来很复杂,那是因为它确实很复杂。在运行时改变和破坏布局是不寻常的。如果我发现我必须做这样的事情,我可能会在层次结构的顶部创建类似 gridLayout 的东西,其中包含我需要在其中设置的不同布局,然后将子小部件从一个布局移动到另一个布局,而无需创建并在运行时销毁它们。

关于c++ - 如何更改/交换小部件的布局?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3728031/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com