无法从 QVBoxLayout 中删除自定义 QWidget
can't remove custom QWidget from QVBoxLayout
这是一个有据可查的问题,但经过一些阅读和尝试后,我仍在努力从 QVBoxLayout
.
中删除自定义小部件
在 MyClass.h
文件中,我声明了一个向量来保存 QPointer
个对象:
vector< QPointer<MyWidget> > myWidgets;
在 MyClass.cpp
文件中,我正在创建小部件并将其添加到布局中:
// create object
void MyClass::createMyWidget() {
QPointer<MyWidget> myWidget(new MyWidget());
myWidgets.push_back(myWidget);
}
//display in layout
void MyClass::displayWidgets() {
for(int i = 0; i < myWidgets.size(); i++) {
myWidgets[i]->setId(i);
ui->myVBoxLayout->addWidget(myWidgets[i].data());
}
}
我尝试了以下方法从布局中删除小部件:
void MyClass::removeMyWidget(int id) { // id of the custom widget. id is also position in the layout
for(int i = 0; i < myWidgets.size(); i++) {
if(items[i]->getId() == id) { //correctly targets the widget
// method 1
ui->myVBoxLayout->removeItem(ui->myVBoxLayout->takeAt(i));
//method 2
//ui->myVBoxLayout->removeWidget(items[i]);
}
}
}
以上均无效,我也无法弄清楚原因。
在 Qt 中,布局只是调整和定位小部件(以及其他项目,如嵌套布局或间隔器)的管理器。
当您从布局中删除一个项目时,它仍然是布局布局的父窗口小部件的子窗口小部件,只是不再管理其几何形状。尽管如此,小部件仍然存在并显示,并且用户可以与其交互。
您还必须将其删除或隐藏。尝试
void MyClass::removeMyWidget(int id){ // id of the custom widget. id is also position in the layout
for(int i=0;i<myWidgets.size();i++){
if(items[i]->getId() == id){ //correctly targets the widget
ui->myVBoxLayout->removeWidget(myWidgets[i]);
delete myWidgets[i]; // <= Delete widget
}
}
}
这是一个有据可查的问题,但经过一些阅读和尝试后,我仍在努力从 QVBoxLayout
.
在 MyClass.h
文件中,我声明了一个向量来保存 QPointer
个对象:
vector< QPointer<MyWidget> > myWidgets;
在 MyClass.cpp
文件中,我正在创建小部件并将其添加到布局中:
// create object
void MyClass::createMyWidget() {
QPointer<MyWidget> myWidget(new MyWidget());
myWidgets.push_back(myWidget);
}
//display in layout
void MyClass::displayWidgets() {
for(int i = 0; i < myWidgets.size(); i++) {
myWidgets[i]->setId(i);
ui->myVBoxLayout->addWidget(myWidgets[i].data());
}
}
我尝试了以下方法从布局中删除小部件:
void MyClass::removeMyWidget(int id) { // id of the custom widget. id is also position in the layout
for(int i = 0; i < myWidgets.size(); i++) {
if(items[i]->getId() == id) { //correctly targets the widget
// method 1
ui->myVBoxLayout->removeItem(ui->myVBoxLayout->takeAt(i));
//method 2
//ui->myVBoxLayout->removeWidget(items[i]);
}
}
}
以上均无效,我也无法弄清楚原因。
在 Qt 中,布局只是调整和定位小部件(以及其他项目,如嵌套布局或间隔器)的管理器。
当您从布局中删除一个项目时,它仍然是布局布局的父窗口小部件的子窗口小部件,只是不再管理其几何形状。尽管如此,小部件仍然存在并显示,并且用户可以与其交互。
您还必须将其删除或隐藏。尝试
void MyClass::removeMyWidget(int id){ // id of the custom widget. id is also position in the layout
for(int i=0;i<myWidgets.size();i++){
if(items[i]->getId() == id){ //correctly targets the widget
ui->myVBoxLayout->removeWidget(myWidgets[i]);
delete myWidgets[i]; // <= Delete widget
}
}
}