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