mirror of
https://github.com/introlab/rtabmap.git
synced 2026-09-02 01:20:25 +08:00
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:
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user