From cf83c0b651790446c73dae29f68cec9e2ba6af9e Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Wed, 23 Apr 2025 16:31:05 +0200 Subject: [PATCH] QmlDesigner: Fix crash when switching to first .ui.qml file if Qt Creator is already in Design mode. QmlDesignerPlugin::showDesigner() was only called on a switch to Design mode while the editor is a .ui.qml file. So it wasn't called when opening a .ui file in Design mode and then switching to a .ui.qml file. But showDesigner() creates the QmlDesigner widgets, so it must be called. Fixes: QTCREATORBUG-32854 Change-Id: I02a498ce00fc1afdee900752ade7af6c62b787b7 Reviewed-by: Thomas Hartmann --- src/plugins/qmldesigner/designmodewidget.cpp | 5 +++++ src/plugins/qmldesigner/designmodewidget.h | 2 ++ src/plugins/qmldesigner/qmldesignerplugin.cpp | 11 +++++++++-- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/plugins/qmldesigner/designmodewidget.cpp b/src/plugins/qmldesigner/designmodewidget.cpp index 34183af8b26..3dea9e15762 100644 --- a/src/plugins/qmldesigner/designmodewidget.cpp +++ b/src/plugins/qmldesigner/designmodewidget.cpp @@ -651,6 +651,11 @@ void DesignModeWidget::setMinimumSizeHintFromContentMinimumSize(bool value) dockContainer->layout()->update(); } +bool DesignModeWidget::isInitialized() const +{ + return m_initStatus == Initialized; +} + void DesignModeWidget::dragEnterEvent(QDragEnterEvent *event) { event->accept(); diff --git a/src/plugins/qmldesigner/designmodewidget.h b/src/plugins/qmldesigner/designmodewidget.h index 881335da75c..38be692b109 100644 --- a/src/plugins/qmldesigner/designmodewidget.h +++ b/src/plugins/qmldesigner/designmodewidget.h @@ -75,6 +75,8 @@ public: void setMinimumSizeHintFromContentMinimumSize(bool value); + bool isInitialized() const; + signals: void navigationHistoryChanged(); void initialized(); diff --git a/src/plugins/qmldesigner/qmldesignerplugin.cpp b/src/plugins/qmldesigner/qmldesignerplugin.cpp index 61dfb8adf45..b0f7c7f0891 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.cpp +++ b/src/plugins/qmldesigner/qmldesignerplugin.cpp @@ -529,8 +529,15 @@ void QmlDesignerPlugin::hideDesigner() void QmlDesignerPlugin::changeEditor() { - clearDesigner(); - setupDesigner(); + if (d->mainWidget.isInitialized()) { + // showDesigner was already already called + clearDesigner(); + setupDesigner(); + } else { + // we are already in Design mode, but showDesigner wasn't called yet, + // so we need to call that to set up the widgets + showDesigner(); + } } void QmlDesignerPlugin::jumpTextCursorToSelectedModelNode()