Commit 1cb0d7f9 authored by Don Gagne's avatar Don Gagne

Merge pull request #998 from DonLakeFlyer/Destroyed

Be careful with QObject:::destroyed signal
parents 7fe044d1 491b1b01
...@@ -3352,8 +3352,8 @@ void UAS::addLink(LinkInterface* link) ...@@ -3352,8 +3352,8 @@ void UAS::addLink(LinkInterface* link)
void UAS::removeLink(QObject* object) void UAS::removeLink(QObject* object)
{ {
// Be careful of the fact that by the time this signal makes it through the queue // Do not dynamic cast or de-reference QObject, since object is either in destructor or may have already
// the link object has already been destructed. So no dynamic_cast for example. // been destroyed.
LinkInterface* link = (LinkInterface*)object; LinkInterface* link = (LinkInterface*)object;
......
...@@ -1410,6 +1410,9 @@ void MainWindow::simulateLink(bool simulate) { ...@@ -1410,6 +1410,9 @@ void MainWindow::simulateLink(bool simulate) {
void MainWindow::commsWidgetDestroyed(QObject *obj) void MainWindow::commsWidgetDestroyed(QObject *obj)
{ {
// Do not dynamic cast or de-reference QObject, since object is either in destructor or may have already
// been destroyed.
if (commsWidgetList.contains(obj)) if (commsWidgetList.contains(obj))
{ {
commsWidgetList.removeOne(obj); commsWidgetList.removeOne(obj);
......
...@@ -10,45 +10,44 @@ QGCUASFileViewMulti::QGCUASFileViewMulti(QWidget *parent) : ...@@ -10,45 +10,44 @@ QGCUASFileViewMulti::QGCUASFileViewMulti(QWidget *parent) :
{ {
ui->setupUi(this); ui->setupUi(this);
setMinimumSize(600, 80); setMinimumSize(600, 80);
connect(UASManager::instance(), SIGNAL(UASCreated(UASInterface*)), this, SLOT(systemCreated(UASInterface*))); connect(UASManager::instance(), &UASManager::UASCreated, this, &QGCUASFileViewMulti::systemCreated);
connect(UASManager::instance(), SIGNAL(activeUASSet(int)), this, SLOT(systemSetActive(int))); connect(UASManager::instance(), SIGNAL(activeUASSet(UASInterface*)), this, SLOT(systemSetActive(UASInterface*)));
if (UASManager::instance()->getActiveUAS()) { if (UASManager::instance()->getActiveUAS()) {
systemCreated(UASManager::instance()->getActiveUAS()); systemCreated(UASManager::instance()->getActiveUAS());
systemSetActive(UASManager::instance()->getActiveUAS()->getUASID()); systemSetActive(UASManager::instance()->getActiveUAS());
} }
} }
void QGCUASFileViewMulti::systemDeleted(QObject* uas) void QGCUASFileViewMulti::systemDeleted(QObject* uas)
{ {
UASInterface* mav = dynamic_cast<UASInterface*>(uas); Q_ASSERT(uas);
if (mav)
{ // Do not dynamic cast or de-reference QObject, since object is either in destructor or may have already
int id = mav->getUASID(); // been destroyed.
QGCUASFileView* list = lists.value(id, NULL);
UASInterface* mav = static_cast<UASInterface*>(uas);
QGCUASFileView* list = lists.value(mav, NULL);
if (list) if (list)
{ {
delete list; delete list;
lists.remove(id); lists.remove(mav);
}
} }
} }
void QGCUASFileViewMulti::systemCreated(UASInterface* uas) void QGCUASFileViewMulti::systemCreated(UASInterface* uas)
{ {
if (!uas) { Q_ASSERT(uas);
return;
}
QGCUASFileView* list = new QGCUASFileView(ui->stackedWidget, uas->getFileManager()); QGCUASFileView* list = new QGCUASFileView(ui->stackedWidget, uas->getFileManager());
lists.insert(uas->getUASID(), list); lists.insert(uas, list);
ui->stackedWidget->addWidget(list); ui->stackedWidget->addWidget(list);
// Ensure widget is deleted when system is deleted // Ensure widget is deleted when system is deleted
connect(uas, SIGNAL(destroyed(QObject*)), this, SLOT(systemDeleted(QObject*))); connect(uas, SIGNAL(destroyed(QObject*)), this, SLOT(systemDeleted(QObject*)));
} }
void QGCUASFileViewMulti::systemSetActive(int uas) void QGCUASFileViewMulti::systemSetActive(UASInterface* uas)
{ {
QGCUASFileView* list = lists.value(uas, NULL); QGCUASFileView* list = lists.value(uas, NULL);
if (list) { if (list) {
......
...@@ -23,11 +23,11 @@ public: ...@@ -23,11 +23,11 @@ public:
public slots: public slots:
void systemDeleted(QObject* uas); void systemDeleted(QObject* uas);
void systemCreated(UASInterface* uas); void systemCreated(UASInterface* uas);
void systemSetActive(int uas); void systemSetActive(UASInterface* uas);
protected: protected:
void changeEvent(QEvent *e); void changeEvent(QEvent *e);
QMap<int, QGCUASFileView*> lists; QMap<UASInterface*, QGCUASFileView*> lists;
private: private:
Ui::QGCUASFileViewMulti *ui; Ui::QGCUASFileViewMulti *ui;
......
...@@ -25,7 +25,10 @@ QGCWaypointListMulti::QGCWaypointListMulti(QWidget *parent) : ...@@ -25,7 +25,10 @@ QGCWaypointListMulti::QGCWaypointListMulti(QWidget *parent) :
void QGCWaypointListMulti::systemDeleted(QObject* uas) void QGCWaypointListMulti::systemDeleted(QObject* uas)
{ {
UASInterface* mav = dynamic_cast<UASInterface*>(uas); // Do not dynamic cast or de-reference QObject, since object is either in destructor or may have already
// been destroyed.
UASInterface* mav = static_cast<UASInterface*>(uas);
if (mav) if (mav)
{ {
int id = mav->getUASID(); int id = mav->getUASID();
......
...@@ -302,6 +302,9 @@ void WaypointEditableView::initializeActionView(int actionID) ...@@ -302,6 +302,9 @@ void WaypointEditableView::initializeActionView(int actionID)
void WaypointEditableView::deleted(QObject* waypoint) void WaypointEditableView::deleted(QObject* waypoint)
{ {
// Do not dynamic cast or de-reference QObject, since object is either in destructor or may have already
// been destroyed.
Q_UNUSED(waypoint); Q_UNUSED(waypoint);
} }
......
...@@ -561,8 +561,9 @@ void QGCToolWidget::addToolWidget(QGCToolWidgetItem* widget) ...@@ -561,8 +561,9 @@ void QGCToolWidget::addToolWidget(QGCToolWidgetItem* widget)
void QGCToolWidget::widgetRemoved() void QGCToolWidget::widgetRemoved()
{ {
//Must static cast and not dynamic cast since the object is in the destructor // Do not dynamic cast or de-reference QObject, since object is either in destructor or may have already
//and we only want to use it as a pointer value // been destroyed.
QGCToolWidgetItem *widget = static_cast<QGCToolWidgetItem *>(QObject::sender()); QGCToolWidgetItem *widget = static_cast<QGCToolWidgetItem *>(QObject::sender());
toolItemList.removeAll(widget); toolItemList.removeAll(widget);
storeWidgetsToSettings(); storeWidgetsToSettings();
......
...@@ -25,7 +25,10 @@ QAction *MenuActionHelper::createToolAction(const QString &title, const QString ...@@ -25,7 +25,10 @@ QAction *MenuActionHelper::createToolAction(const QString &title, const QString
void MenuActionHelper::removeDockWidget() void MenuActionHelper::removeDockWidget()
{ {
QObject *dockWidget = QObject::sender(); //Note that we can't cast to QDockWidget because we are in its destructor // Do not dynamic cast or de-reference QObject, since object is either in destructor or may have already
// been destroyed.
QObject *dockWidget = QObject::sender();
Q_ASSERT(dockWidget); Q_ASSERT(dockWidget);
qDebug() << "Dockwidget:" << dockWidget->objectName() << "of type" << dockWidget->metaObject()->className(); qDebug() << "Dockwidget:" << dockWidget->objectName() << "of type" << dockWidget->metaObject()->className();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment