我到处搜索,发现没有解决这个问题。我制作一个QVBoxLayout,然后进行数据的Web调用。当数据返回时,我向此QVBoxLayout添加了4个自定义小部件
verticalLayout->addWidget(nsd);
对于前四个,这很有效。一切都按需要显示。但是,我想删除四个小部件中的任何一个,然后在底部添加一个小部件。删除工作正常
verticalLayout->removeWidget(nsd);
delete nsd;
我知道它工作正常,因为那个小部件不再绘制到我的屏幕上。问题是添加小部件并不完全正常。我调用相同的代码
verticalLayout->addWidget(nsd);
并检查verticalLayout-> count()告诉我有4个项目。使用与之前添加的小部件相同的父窗口小部件创建窗口小部件。永远不会调用新窗口小部件的paint事件。此外,屏幕上显示的3显示间隔3个项目。它不像任何地方都有洞。我也尝试添加然后删除,但它是同样的问题。新项目永远不会被绘制,其大小永远不会被考虑在内。
答案 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();
}