【问题标题】:Qt - change QWidget layoutQt - 改变 QWidget 布局
【发布时间】:2011-02-28 17:40:51
【问题描述】:

假设我们有一个QWidget 和一个名为general_layoutQLayout,其中包含其他小部件和布局。 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);

【问题讨论】:

  • 您能更具体地谈谈您的问题吗?您所做的似乎是正确的(即在设置新布局之前删除旧布局)。
  • 当然!我执行以下操作:删除general_layout; general_layout = new QHBoxLayout; general_layout->addLayout(some_layout); myQWidget->setLayout(general_layout);

标签: qt layout qt4 qwidget


【解决方案1】:

问题是布局的小部件在删除布局时不会被破坏。这会导致 myQWidget 的所有子小部件仍然存在,即使没有布局。

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

qDeleteAll(myQWidget->children());

之后

delete general_layout;

【讨论】:

  • 似乎是问题所在。非常感谢!!!还有一个问题。我想要一个改变其结构的对话框(在这个问题的方面)。所以我通过创建布局、删除和创建新布局来做到这一点。这是个好方法吗?
  • 如果您不再需要第一个结构,可能会这样。如果这样做,使用 QStackedLayout (doc.trolltech.com/latest/qstackedlayout.html) 会容易得多。如果您尝试实现类似向导的功能,请查看 QWizard (doc.trolltech.com/latest/qwizard.html)。
  • qDeleteAll(myQWidget->children());函数删除所有孩子,但是孩子的孩子呢?我的意思是在 myQWidget 的子元素中,没有作为 general_layout 子布局的布局。当我调用 general_layout 的子布局的方法时,我的应用程序崩溃了(所以我来宾该指针被销毁),但是当我检查它是否等于 0(m_childLayout_of_General_Layout == 0)时,if 语句被忽略。怎么了?是删了还是没删?
  • 是的,所有子项(直接或间接)都将被删除(查看doc.qt.nokia.com/latest/qobject.html#dtor.QObject)。在 C++ 中,对指针调用 delete 不会将此指针设置为 0。这就是 if 语句不起作用的原因。正如我之前所说,如果您仍然需要旧的小部件,使用 QStackedLayout 可能是要走的路。
  • 也许您应该让子小部件成为它们所在布局的子小部件,而不是它们的逻辑祖父?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多