QT 子窗口关闭后资源被释放,再次打开出错
问题:菜单栏点击后弹出一个子窗口Dialog,在该窗口中配置参数传递给主窗口,确定好参数后子窗口自动关闭,再打开的时候资源就被释放掉了,再也打不开。
解决:打开之前,把被释放掉的资源重新初始化一次。经过尝试,被释放掉的应该是qvtkWidget和viewer的捆绑关系,也就是要初始化的内容。
下面代码是子窗口cpp,里面定义了一个qvtkWidget和PCLVisualizer捆绑来做pcl的点云显示,也就是要初始化的内容。
filterdialog.cpp
#include "filterdialog.h"
#include "ui_filterdialog.h"
filterdialog::filterdialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::filterdialog)
{
ui->setupUi(this);
filterviewer.reset(new pcl::visualization::PCLVisualizer ("filterviewer", false));
ui->filter_qvtkWidget->SetRenderWindow (filterviewer->getRenderWindow());
filterviewer->setupInteractor(ui->filter_qvtkWidget->GetInteractor(), ui->filter_qvtkWidget->GetRenderWindow());
filterviewer->setBackgroundColor(0,0,0);
ui->filter_qvtkWidget->update();
}
void filterdialog::initialization()
{
filterviewer.reset(new pcl::visualization::PCLVisualizer ("filterviewer", false));
ui->filter_qvtkWidget->SetRenderWindow (filterviewer->getRenderWindow());
filterviewer->setupInteractor(ui->filter_qvtkWidget->GetInteractor(), ui->filter_qvtkWidget->GetRenderWindow());
filterviewer->setBackgroundColor(0,0,0);//背景色
ui->filter_qvtkWidget->update();
}
在filterdialog.h中定义了一个初始化的SLOT,当再次打开时,主窗口调用filterdialog的SLOT(initilization()。
filterdialog.h
public slots:
void initialization();
下面是主窗口菜单栏在打开子窗口时的初始化函数
mainwindow.cpp
/**菜单栏**/
void MainWindow::MenubarAction(QAction *action)
{
if(action == ui->actionOpen)
{
FileOpen();
}else if(action == ui->actionHelp)
{
messagebox();
}else if(action == ui->actionRender)
{
renderdialog->show();
}else if(action == ui->actionFilter)
{
if(loaded == 0)
{
qDebug()<<"please load a .ply file before operate filter";
return;
}
filterwindow->initialization();//自窗口被关闭时会被释放,需要重新初始化
filterwindow->filterviewer->removePointCloud("filtercloud");
filterwindow->filterviewer->addPointCloud<pcl::PointXYZRGB>(cloud, "filtercloud");
filterwindow->filterviewer->resetCamera();
filterwindow->ui->filter_qvtkWidget->update();
filterwindow->exec();
}
}