无法从QVBoxLayout中删除自定义QWidget

时间:2015-11-13 13:58:29

标签: c++ qt qwidget qlayout

这是一个记录合理的问题,但经过一些阅读和尝试后,我仍在努力从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]);
        }
    }
}

上述任何一项工作都没有找到原因。

1 个答案:

答案 0 :(得分:2)

在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
        }
    }
}