From 0a807e8cde1cf6838923c0eee01328741baa9a19 Mon Sep 17 00:00:00 2001 From: matlabbe Date: Thu, 2 Oct 2014 19:33:51 +0000 Subject: [PATCH] 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 --- guilib/include/rtabmap/gui/CloudViewer.h | 1 + guilib/include/rtabmap/gui/OdometryViewer.h | 3 +++ guilib/src/DatabaseViewer.cpp | 12 +++++++----- guilib/src/MainWindow.cpp | 8 ++++---- guilib/src/OdometryViewer.cpp | 9 +++++++++ guilib/src/PreferencesDialog.cpp | 14 ++++++++------ 6 files changed, 32 insertions(+), 15 deletions(-) diff --git a/guilib/include/rtabmap/gui/CloudViewer.h b/guilib/include/rtabmap/gui/CloudViewer.h index b9a8ef2d..08b1b77e 100644 --- a/guilib/include/rtabmap/gui/CloudViewer.h +++ b/guilib/include/rtabmap/gui/CloudViewer.h @@ -155,6 +155,7 @@ public slots: void setCloudVisibility(const std::string & id, bool isVisible); void setCloudOpacity(const std::string & id, double opacity = 1.0); void setCloudPointSize(const std::string & id, int size); + virtual void clear() {removeAllClouds(); clearTrajectory();} protected: virtual void keyReleaseEvent(QKeyEvent * event); diff --git a/guilib/include/rtabmap/gui/OdometryViewer.h b/guilib/include/rtabmap/gui/OdometryViewer.h index b1bcfade..5d7a1f04 100644 --- a/guilib/include/rtabmap/gui/OdometryViewer.h +++ b/guilib/include/rtabmap/gui/OdometryViewer.h @@ -46,6 +46,9 @@ public: OdometryViewer(int maxClouds = 10, int decimation = 2, float voxelSize = 0.0f, int qualityWarningThr=0, QWidget * parent = 0); virtual ~OdometryViewer() {} +public slots: + virtual void clear(); + protected: void handleAction(QAction * a); virtual void handleEvent(UEvent * event); diff --git a/guilib/src/DatabaseViewer.cpp b/guilib/src/DatabaseViewer.cpp index 4be97423..435fd540 100644 --- a/guilib/src/DatabaseViewer.cpp +++ b/guilib/src/DatabaseViewer.cpp @@ -407,8 +407,9 @@ void DatabaseViewer::updateIds() std::map 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::iterator iter = optimizedPoses.begin(); iter!=optimizedPoses.end(); ++iter) { diff --git a/guilib/src/MainWindow.cpp b/guilib/src/MainWindow.cpp index e1d5c581..bbf751a9 100644 --- a/guilib/src/MainWindow.cpp +++ b/guilib/src/MainWindow.cpp @@ -3056,8 +3056,7 @@ void MainWindow::viewScans() std::map::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(); diff --git a/guilib/src/OdometryViewer.cpp b/guilib/src/OdometryViewer.cpp index 353ca4cd..f0add356 100644 --- a/guilib/src/OdometryViewer.cpp +++ b/guilib/src/OdometryViewer.cpp @@ -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; diff --git a/guilib/src/PreferencesDialog.cpp b/guilib/src/PreferencesDialog.cpp index 61993f74..d48b74a8 100644 --- a/guilib/src/PreferencesDialog.cpp +++ b/guilib/src/PreferencesDialog.cpp @@ -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);