QmlDesignerProjectManager: prevent crash at destruction

found in https://the-qt-company-00.sentry.io/issues/5315357110

Change-Id: Ie8d7358c246799c5883e52fbdadb6f3a5e2a4359
Reviewed-by: Qt CI Patch Build Bot <ci_patchbuild_bot@qt.io>
Reviewed-by: Marco Bubke <marco.bubke@qt.io>
(cherry picked from commit a7fd0a78d1)
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
This commit is contained in:
Tim Jenssen
2024-05-08 10:01:52 +02:00
parent 0c4eab7f87
commit 55f782ddfe
2 changed files with 19 additions and 16 deletions

View File

@@ -238,30 +238,34 @@ QmlDesignerProjectManager::QmlDesignerProjectManager(ExternalDependenciesInterfa
, m_externalDependencies{externalDependencies} , m_externalDependencies{externalDependencies}
{ {
auto editorManager = ::Core::EditorManager::instance(); auto editorManager = ::Core::EditorManager::instance();
QObject::connect(editorManager, &::Core::EditorManager::editorOpened, [&](auto *editor) { QObject::connect(editorManager, &::Core::EditorManager::editorOpened, &dummy, [&](auto *editor) {
editorOpened(editor); editorOpened(editor);
}); });
QObject::connect(editorManager, &::Core::EditorManager::currentEditorChanged, [&](auto *editor) { QObject::connect(editorManager,
currentEditorChanged(editor); &::Core::EditorManager::currentEditorChanged,
}); &dummy,
QObject::connect(editorManager, &::Core::EditorManager::editorsClosed, [&](const auto &editors) { [&](auto *editor) { currentEditorChanged(editor); });
editorsClosed(editors); QObject::connect(editorManager,
}); &::Core::EditorManager::editorsClosed,
&dummy,
[&](const auto &editors) { editorsClosed(editors); });
auto sessionManager = ::ProjectExplorer::ProjectManager::instance(); auto sessionManager = ::ProjectExplorer::ProjectManager::instance();
QObject::connect(sessionManager, QObject::connect(sessionManager,
&::ProjectExplorer::ProjectManager::projectAdded, &::ProjectExplorer::ProjectManager::projectAdded,
&dummy,
[&](auto *project) { projectAdded(project); }); [&](auto *project) { projectAdded(project); });
QObject::connect(sessionManager, QObject::connect(sessionManager,
&::ProjectExplorer::ProjectManager::aboutToRemoveProject, &::ProjectExplorer::ProjectManager::aboutToRemoveProject,
&dummy,
[&](auto *project) { aboutToRemoveProject(project); }); [&](auto *project) { aboutToRemoveProject(project); });
QObject::connect(sessionManager, QObject::connect(sessionManager,
&::ProjectExplorer::ProjectManager::projectRemoved, &::ProjectExplorer::ProjectManager::projectRemoved,
&dummy,
[&](auto *project) { projectRemoved(project); }); [&](auto *project) { projectRemoved(project); });
QObject::connect(&m_previewImageCacheData->timer, QObject::connect(&m_previewImageCacheData->timer, &QTimer::timeout, &dummy, [&]() {
&QTimer::timeout, generatePreview();
this, });
&QmlDesignerProjectManager::generatePreview);
} }
QmlDesignerProjectManager::~QmlDesignerProjectManager() = default; QmlDesignerProjectManager::~QmlDesignerProjectManager() = default;
@@ -562,12 +566,12 @@ QmlDesignerProjectManager::ImageCacheData *QmlDesignerProjectManager::imageCache
m_imageCacheData->nodeInstanceCollector.setTarget(project->activeTarget()); m_imageCacheData->nodeInstanceCollector.setTarget(project->activeTarget());
QObject::connect(project, QObject::connect(project,
&ProjectExplorer::Project::activeTargetChanged, &ProjectExplorer::Project::activeTargetChanged,
this, &dummy,
setTargetInImageCache); setTargetInImageCache);
} }
QObject::connect(ProjectExplorer::ProjectManager::instance(), QObject::connect(ProjectExplorer::ProjectManager::instance(),
&ProjectExplorer::ProjectManager::startupProjectChanged, &ProjectExplorer::ProjectManager::startupProjectChanged,
this, &dummy,
[=](ProjectExplorer::Project *project) { [=](ProjectExplorer::Project *project) {
setTargetInImageCache(activeTarget(project)); setTargetInImageCache(activeTarget(project));
}); });

View File

@@ -28,10 +28,8 @@ namespace QmlDesigner {
class ExternalDependenciesInterface; class ExternalDependenciesInterface;
class QmlDesignerProjectManager : public QObject class QmlDesignerProjectManager
{ {
Q_OBJECT
class QmlDesignerProjectManagerProjectData; class QmlDesignerProjectManagerProjectData;
class PreviewImageCacheData; class PreviewImageCacheData;
class ImageCacheData; class ImageCacheData;
@@ -70,5 +68,6 @@ private:
std::unique_ptr<PreviewImageCacheData> m_previewImageCacheData; std::unique_ptr<PreviewImageCacheData> m_previewImageCacheData;
std::unique_ptr<QmlDesignerProjectManagerProjectData> m_projectData; std::unique_ptr<QmlDesignerProjectManagerProjectData> m_projectData;
ExternalDependenciesInterface &m_externalDependencies; ExternalDependenciesInterface &m_externalDependencies;
QObject dummy;
}; };
} // namespace QmlDesigner } // namespace QmlDesigner