QT 5.6 QVBoxLayout removeWidget然后addWidget无法按预期工作

时间:2016-06-14 14:04:26

标签: qt qvboxlayout

我到处搜索,发现没有解决这个问题。我制作一个QVBoxLayout,然后进行数据的Web调用。当数据返回时,我向此QVBoxLayout添加了4个自定义小部件

verticalLayout->addWidget(nsd);

对于前四个,这很有效。一切都按需要显示。但是,我想删除四个小部件中的任何一个,然后在底部添加一个小部件。删除工作正常

 verticalLayout->removeWidget(nsd);
delete nsd;

我知道它工作正常,因为那个小部件不再绘制到我的屏幕上。问题是添加小部件并不完全正常。我调用相同的代码

verticalLayout->addWidget(nsd);

并检查verticalLayout-> count()告诉我有4个项目。使用与之前添加的小部件相同的父窗口小部件创建窗口小部件。永远不会调用新窗口小部件的paint事件。此外,屏幕上显示的3显示间隔3个项目。它不像任何地方都有洞。我也尝试添加然后删除,但它是同样的问题。新项目永远不会被绘制,其大小永远不会被考虑在内。

1 个答案:

答案 0 :(得分:2)

如果你想彻底摆脱一个小部件,你只需要破坏它。你不必担心它是否在布局中。如果动态分配窗口小部件,则只需delete nsd即可,不需要layout->removeWidget调用。您也不必为任何明确的父母提供小部件 - 插入布局将设置适当的父级。

以下是有效的,无论添加/删除的窗口小部件的类型是什么,都是安全的。如果删除调用堆栈上有目标窗口小部件,则应使用deleteLater而不是普通delete。但是当你删除它以响应来自不相关的小部件的信号时,情况永远不会是这种情况,除非目标小部件重新进入事件循环(aargh!它不应该)。

// https://github.com/KubaO/stackoverflown/tree/master/questions/layout-addremove-37814292
#include <QtWidgets>

int main(int argc, char ** argv) {
   QApplication app(argc, argv);
   QWidget widget;
   QVBoxLayout layout(&widget);
   QPushButton button;
   QLabel label("Hello");
   layout.addWidget(&button);
   layout.addWidget(&label);

   auto onClick = [&]{
      if (layout.count() == 3) {
         delete layout.itemAt(2)->widget();
         button.setText("Add");
      } else {
         layout.addWidget(new QLabel("Hello too!"));
         button.setText("Remove");
      }
   };
   QObject::connect(&button, &QPushButton::clicked, onClick);
   onClick();

   widget.show();
   return app.exec();
}