C++ 在Qt中动态创建/销毁自定义小部件

C++ 在Qt中动态创建/销毁自定义小部件,c++,qt,C++,Qt,我只是从Qt开始。我想制作一个带有自定义小部件的GUI,可以用来显示/编辑我的自定义数据类型。我还希望能够动态创建/销毁这些小部件(而不销毁底层数据) 我试图通过在主窗口类中存储我的数据项列表(dataContainer),并将指向dataContainer的指针传递给存储该指针的小部件(customWidget)的构造函数来实现这一点。然后customWidget可以通过该指针更改基础数据 下面的代码允许用户重复向列表中添加dataContainer实例,并编辑每个实例的“名称”。当我运行此程

我只是从Qt开始。我想制作一个带有自定义小部件的GUI,可以用来显示/编辑我的自定义数据类型。我还希望能够动态创建/销毁这些小部件(而不销毁底层数据)

我试图通过在主窗口类中存储我的数据项列表(
dataContainer
),并将指向
dataContainer
的指针传递给存储该指针的小部件(
customWidget
)的构造函数来实现这一点。然后
customWidget
可以通过该指针更改基础数据

下面的代码允许用户重复向列表中添加
dataContainer
实例,并编辑每个实例的“名称”。当我运行此程序时,只要我不实际编辑名称,一切正常,但如果我编辑名称,然后单击“添加”按钮,我会得到一个错误。此SEGFULT发生在
customWidget
的析构函数期间
delete myWidget
窗口::添加()

两个问题:

  • 为什么这个代码会崩溃?我不允许动态创建/销毁这样的小部件吗
  • 有没有更合适的方法来实现这一点 如果我在这里遗漏了一些基本的东西,我很抱歉,但是我上下浏览了很多论坛和教程,没有发现任何有用的东西

    main.cpp

    #包括
    #包括“window.h”
    int main(int argc,char*argv[])
    {
    QApplication应用程序(argc、argv);
    窗口主窗口;
    mainWindow.show();
    返回app.exec();
    }
    
    window.h

    \ifndef窗口
    #定义窗口
    #包括
    #包括“customwidget.h”
    类窗口:公共QWidget{
    Q_对象
    公众:
    窗口();
    公众时段:
    无效添加();
    私人:
    //主要数据结构
    QList数据表;
    //显示自定义数据的小部件
    customWidget*myWidget;
    QVBoxLayout*主布局;
    QPushButton*addButton;
    };
    #恩迪夫
    
    window.cpp

    #包括
    #包括“window.h”
    Window::Window(){
    //从列表中的一条数据开始
    数据容器;
    dataList.append(newData);
    //创建布局容器
    mainLayout=新的QVBoxLayout(本);
    mainLayout->setAlignment(Qt::AlignTop);
    //创建Add按钮,并连接其clicked()信号
    //添加到我们的add()插槽
    addButton=新的QPushButton(tr(“添加”),本文件);
    连接(添加按钮、信号(单击())、此、插槽(添加());
    mainLayout->addWidget(addButton);
    //创建一个自定义小部件来显示我们的数据和
    //给它一个指向它将显示/修改的数据的指针
    myWidget=newcustomwidget(this,&(dataList.last());
    mainLayout->addWidget(myWidget);
    设置布局(主布局);
    }
    空窗口::添加(){
    //创建一条新数据,并添加到列表中
    数据容器;
    dataList.append(newData);
    //调试:显示当前列表
    
    qDebug()不能直接删除添加到版面的小部件。相反,您可以尝试以下代码,从版面中删除特定的小部件和相应的版面项目:

    QLayoutItem* item;
    while ( ( item = mainLayout->takeAt( 0 ) ) != NULL )
    {
        if(item->widget() == myWidget){
            delete item->widget();
            delete item;
        }
    }
    

    您可以使用以下代码将小部件添加到
    mainLayout
    mainLayout->addWidget(myWidget);
    但是当您删除小部件时,您需要首先从mainLayout小部件集合中删除小部件。这并不能解决问题。我将
    mainLayout->removeWidget(myWidget)
    删除myWidget之前;
    我也尝试过使用
    断开连接
    我的Widget->deleteLater()
    。它也无法解释为什么只在文本被编辑时才显示错误。为什么不重用小部件?多次创建和删除可能会导致内存泄漏。我不想重用小部件,因为我想使用相同的图形空间为不同的数据类型显示不同的小部件(即多态性)。这是一个简化的示例,但在实际情况中,自定义小部件将包含几个基本的小部件。为什么多次创建/删除会导致内存泄漏?从布局中删除小部件是安全的,之前没有明确删除它。谢谢,这修复了它,尽管现在我似乎无法让它在列表中迭代。有些事情可能会发生pens和my list.count()返回-someLargeNum?,但无论如何,我相信这是一个新问题。