无法从 QVBoxLayout 中删除自定义 QWidget

Posted

技术标签:

【中文标题】无法从 QVBoxLayout 中删除自定义 QWidget【英文标题】:can't remove custom QWidget from QVBoxLayout 【发布时间】:2015-11-13 13:58:29 【问题描述】:

这是一个有据可查的问题,但经过一些阅读和尝试后,我仍在努力从 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】:

在 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 中删除自定义 QWidget的主要内容,如果未能解决你的问题,请参考以下文章

在 QLayout 中创建和删除自定义 QWidget 时出现 RAM 问题

pyqt5-布局控件

使用带有选项卡布局的自定义视图时无法从选项卡中删除填充

无法从快速访问工具栏 (QAT) 菜单中删除自定义功能区控件

从布局中删除所有项目

使用基本适配器解决方案从自定义列表中删除行视图