0

我到处搜索,没有找到解决这个问题的方法。我制作了一个 QVBoxLayout,然后对数据进行了网络调用。当数据返回时,我将 4 个自定义小部件添加到此 QVBoxLayout

verticalLayout->addWidget(nsd);

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

 verticalLayout->removeWidget(nsd);
delete nsd;

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

verticalLayout->addWidget(nsd);

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

4

1 回答 1

2

如果你想完全摆脱一个小部件,你只需要破坏它。如果它在布局中,您不必担心。如果小部件是动态分配的,那么delete nsd您只需要,不需要layout->removeWidget调用。您也不必为小部件提供任何明确的父级 - 插入布局将设置正确的父级。

无论添加/删除的小部件的类型是什么,以下操作都是安全的。如果删除在调用堆栈上有目标小部件,则应使用deleteLater而不是 plain delete。但是,当您响应来自无关小部件的信号而将其删除时,情况绝不会出现这种情况,除非目标小部件重新进入事件循环(啊!它不应该)。

// 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();
}
于 2016-06-14T14:47:25.907 回答