Found a workaround for Issue 5 to avoid segmentation faults. The data included in the created window are cleared, but the window itself is not destroyed, only when its parent is deleted -> here the MainWindow. It seems that child CloudViewer windows don't crash when deleted on application exit.

git-svn-id: http://rtabmap.googlecode.com/svn/trunk/rtabmap@1826 f169173b-cf89-36c8-b27e-44dbe73f0c83
This commit is contained in:
matlabbe
2014-10-02 19:33:51 +00:00
parent 2badfb5faf
commit 0a807e8cde
6 changed files with 32 additions and 15 deletions

View File

@@ -407,8 +407,9 @@ void DatabaseViewer::updateIds()
std::map<int, int> nids = memory_->getNeighborsId(memory_->getLastWorkingSignature()->id(), 0, -1, true);
memory_->getMetricConstraints(uKeys(nids), poses_, links_, true);
ui_->spinBox_optimizationsFrom->setRange(1, memory_->getLastWorkingSignature()->id());
ui_->spinBox_optimizationsFrom->setValue(memory_->getLastWorkingSignature()->id());
int first = nids.begin()->first;
ui_->spinBox_optimizationsFrom->setRange(first, memory_->getLastWorkingSignature()->id());
ui_->spinBox_optimizationsFrom->setValue(first);
}
ui_->actionGenerate_TORO_graph_graph->setEnabled(false);
@@ -740,8 +741,8 @@ void DatabaseViewer::view3DMap()
progressDialog.incrementStep();
// create a window
QWidget * window = new QWidget(this, Qt::Window);
window->setAttribute(Qt::WA_DeleteOnClose);
QDialog * window = new QDialog(this, Qt::Window);
window->setModal(this->isModal());
window->setWindowTitle(tr("3D Map"));
window->setMinimumWidth(800);
window->setMinimumHeight(600);
@@ -752,8 +753,9 @@ void DatabaseViewer::view3DMap()
layout->addWidget(viewer);
viewer->setCameraLockZ(false);
window->setLayout(layout);
connect(window, SIGNAL(finished(int)), viewer, SLOT(clear()));
window->showNormal();
window->show();
for(std::map<int, Transform>::iterator iter = optimizedPoses.begin(); iter!=optimizedPoses.end(); ++iter)
{

View File

@@ -3056,8 +3056,7 @@ void MainWindow::viewScans()
std::map<int, pcl::PointCloud<pcl::PointXYZ>::Ptr> scans;
if(getExportedScans(scans))
{
QWidget * window = new QWidget(this, Qt::Window);
window->setAttribute(Qt::WA_DeleteOnClose);
QDialog * window = new QDialog(this, Qt::Window);
window->setWindowFlags(Qt::Dialog);
window->setWindowTitle(tr("Scans (%1 nodes)").arg(scans.size()));
window->setMinimumWidth(800);
@@ -3069,6 +3068,7 @@ void MainWindow::viewScans()
QVBoxLayout *layout = new QVBoxLayout();
layout->addWidget(viewer);
window->setLayout(layout);
connect(window, SIGNAL(finished(int)), viewer, SLOT(clear()));
window->show();
@@ -3208,8 +3208,7 @@ void MainWindow::viewClouds()
if(getExportedClouds(clouds, meshes, false))
{
QWidget * window = new QWidget(this, Qt::Window);
window->setAttribute(Qt::WA_DeleteOnClose);
QDialog * window = new QDialog(this, Qt::Window);
if(meshes.size())
{
window->setWindowTitle(tr("Meshes (%1 nodes)").arg(meshes.size()));
@@ -3227,6 +3226,7 @@ void MainWindow::viewClouds()
QVBoxLayout *layout = new QVBoxLayout();
layout->addWidget(viewer);
window->setLayout(layout);
connect(window, SIGNAL(finished(int)), viewer, SLOT(clear()));
window->show();

View File

@@ -68,6 +68,15 @@ OdometryViewer::OdometryViewer(int maxClouds, int decimation, float voxelSize, i
menu()->addAction(_aPause);
}
void OdometryViewer::clear()
{
dataMutex_.lock();
data_.clear();
dataMutex_.unlock();
clouds_.clear();
CloudViewer::clear();
}
void OdometryViewer::processData()
{
rtabmap::SensorData data;

View File

@@ -1798,7 +1798,6 @@ void PreferencesDialog::selectSourceRGBD(Src src)
void PreferencesDialog::openDatabaseViewer()
{
DatabaseViewer * viewer = new DatabaseViewer(this);
viewer->setAttribute(Qt::WA_DeleteOnClose, true);
viewer->setWindowModality(Qt::WindowModal);
if(viewer->openDatabase(_ui->source_database_lineEdit_path->text()))
{
@@ -2978,16 +2977,19 @@ void PreferencesDialog::testOdometry(int type)
_odomThread = new OdometryThread(odometry); // take ownership of odometry
QWidget * window = new QWidget(this, Qt::Popup);
QDialog * window = new QDialog(this);
window->setWindowModality(Qt::WindowModal);
window->setAttribute(Qt::WA_DeleteOnClose);
window->setWindowFlags(Qt::Dialog);
window->setWindowTitle(tr("Odometry viewer"));
window->setMinimumWidth(800);
window->setMinimumHeight(600);
connect( window, SIGNAL(destroyed(QObject*)), this, SLOT(cleanOdometryTest()) );
connect( window, SIGNAL(finished(int)), this, SLOT(cleanOdometryTest()) );
OdometryViewer * odomViewer = new OdometryViewer(10, 2, 0.0, this->getOdomQualityWarnThr(), window);
OdometryViewer * odomViewer = new OdometryViewer(10,
_ui->spinBox_decimation_odom->value(),
_ui->doubleSpinBox_voxelSize_odom->value(),
this->getOdomQualityWarnThr(),
window);
connect( window, SIGNAL(finished(int)), odomViewer, SLOT(clear()) );
odomViewer->setCameraFree();
odomViewer->setGridShown(true);