QT 5.6 QVBoxLayout removeWidget 然后 addWidget 无法按预期工作
QT 5.6 QVBoxLayout removeWidget then addWidget not working as expected
我到处搜索,没有找到解决这个问题的方法。我制作了一个 QVBoxLayout,然后进行了网络调用以获取数据。当数据返回时,我向这个 QVBoxLayout
添加了 4 个自定义小部件
verticalLayout->addWidget(nsd);
前四个效果很好。一切都按需出现。但是,我想删除四个小部件中的任何一个,然后在底部添加一个小部件。删除效果很好
verticalLayout->removeWidget(nsd);
delete nsd;
我知道它工作正常,因为那个小部件不再绘制到我的屏幕上。问题是添加小部件并不完全有效。我调用相同的代码
verticalLayout->addWidget(nsd);
检查 verticalLayout->count() 告诉我有 4 个项目。该小部件是使用与之前添加的相同的父小部件创建的。永远不会调用新小部件的绘制事件。此外,屏幕上显示的 3 显示间隔为 3 个项目。又不是什么地方都有洞。我也尝试添加然后删除,但这是同样的问题。永远不会绘制新项目,也不会考虑其大小。
如果你想彻底摆脱一个widget,你只需要销毁它。如果它在布局中,您不必担心。如果小部件是动态分配的,那么 delete nsd
就是您所需要的,不需要 layout->removeWidget
调用。您也不必为小部件提供任何明确的父级 - 插入到布局中将设置正确的父级。
无论 added/removed 的小部件是什么类型,以下内容都有效且安全。如果删除在调用堆栈上有目标小部件,您应该使用 deleteLater
而不是普通的 delete
。但是,当您响应来自不相关小部件的信号而删除它时,情况永远不会是这样,除非目标小部件重新进入事件循环(aargh!它不应该)。
// https://github.com/KubaO/Whosebugn/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();
}
我到处搜索,没有找到解决这个问题的方法。我制作了一个 QVBoxLayout,然后进行了网络调用以获取数据。当数据返回时,我向这个 QVBoxLayout
添加了 4 个自定义小部件verticalLayout->addWidget(nsd);
前四个效果很好。一切都按需出现。但是,我想删除四个小部件中的任何一个,然后在底部添加一个小部件。删除效果很好
verticalLayout->removeWidget(nsd);
delete nsd;
我知道它工作正常,因为那个小部件不再绘制到我的屏幕上。问题是添加小部件并不完全有效。我调用相同的代码
verticalLayout->addWidget(nsd);
检查 verticalLayout->count() 告诉我有 4 个项目。该小部件是使用与之前添加的相同的父小部件创建的。永远不会调用新小部件的绘制事件。此外,屏幕上显示的 3 显示间隔为 3 个项目。又不是什么地方都有洞。我也尝试添加然后删除,但这是同样的问题。永远不会绘制新项目,也不会考虑其大小。
如果你想彻底摆脱一个widget,你只需要销毁它。如果它在布局中,您不必担心。如果小部件是动态分配的,那么 delete nsd
就是您所需要的,不需要 layout->removeWidget
调用。您也不必为小部件提供任何明确的父级 - 插入到布局中将设置正确的父级。
无论 added/removed 的小部件是什么类型,以下内容都有效且安全。如果删除在调用堆栈上有目标小部件,您应该使用 deleteLater
而不是普通的 delete
。但是,当您响应来自不相关小部件的信号而删除它时,情况永远不会是这样,除非目标小部件重新进入事件循环(aargh!它不应该)。
// https://github.com/KubaO/Whosebugn/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();
}