diff --git a/sources/ElementsCollection/elementscollectionmodel.cpp b/sources/ElementsCollection/elementscollectionmodel.cpp index 210886e5d..a32eeb674 100644 --- a/sources/ElementsCollection/elementscollectionmodel.cpp +++ b/sources/ElementsCollection/elementscollectionmodel.cpp @@ -38,6 +38,20 @@ ElementsCollectionModel::ElementsCollectionModel(QObject *parent) : { } +/** + @brief ElementsCollectionModel::~ElementsCollectionModel + Destructor. loadCollections() may still have background threads + (via QtConcurrent::map()) running setUpData() on this model's items + when the model is destroyed (e.g. the user cancels the dialog before + loading finishes). Wait for them here so QStandardItemModel's + destructor doesn't free items out from under them, which used to + crash the whole application (bugtracker #291). +*/ +ElementsCollectionModel::~ElementsCollectionModel() +{ + m_future.waitForFinished(); +} + /** @brief ElementsCollectionModel::data Reimplemented from QStandardItemModel diff --git a/sources/ElementsCollection/elementscollectionmodel.h b/sources/ElementsCollection/elementscollectionmodel.h index 1bf12e66e..c2a7297ae 100644 --- a/sources/ElementsCollection/elementscollectionmodel.h +++ b/sources/ElementsCollection/elementscollectionmodel.h @@ -35,6 +35,7 @@ class ElementsCollectionModel : public QStandardItemModel public: ElementsCollectionModel(QObject *parent = Q_NULLPTR); + ~ElementsCollectionModel() override; QVariant data(const QModelIndex &index, int role) const override; QMimeData *mimeData(const QModelIndexList &indexes) const override;