QmlDesigner: Fix potential crash

The new selected ModelNode (m_selectedNode) was set to early, since
we defer the creation of the QML frontend.

We have to set m_selectedNode when the QML frontend is actually created.
Otherwise, we might access an uninitialized QML frontend.

Change-Id: I630b103246c414c737c977e233180723df0c3160
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
This commit is contained in:
Thomas Hartmann
2019-08-28 12:03:12 +02:00
parent 217f0c0305
commit c61702fca4
2 changed files with 24 additions and 16 deletions

View File

@@ -389,6 +389,8 @@ void PropertyEditorView::resetView()
if (model() == nullptr) if (model() == nullptr)
return; return;
setSelelectedModelNode();
m_locked = true; m_locked = true;
if (debug) if (debug)
@@ -526,21 +528,16 @@ void PropertyEditorView::removePropertyFromModel(const PropertyName &propertyNam
m_locked = false; m_locked = false;
} }
void PropertyEditorView::selectedNodesChanged(const QList<ModelNode> &selectedNodeList, void PropertyEditorView::selectedNodesChanged(const QList<ModelNode> &,
const QList<ModelNode> &lastSelectedNodeList) const QList<ModelNode> &)
{ {
Q_UNUSED(lastSelectedNodeList); select();
if (selectedNodeList.isEmpty())
select(ModelNode());
else
select(selectedNodeList.constFirst());
} }
void PropertyEditorView::nodeAboutToBeRemoved(const ModelNode &removedNode) void PropertyEditorView::nodeAboutToBeRemoved(const ModelNode &removedNode)
{ {
if (m_selectedNode.isValid() && removedNode.isValid() && m_selectedNode == removedNode) if (m_selectedNode.isValid() && removedNode.isValid() && m_selectedNode == removedNode)
select(m_selectedNode.parentProperty().parentModelNode()); select();
} }
void PropertyEditorView::modelAttached(Model *model) void PropertyEditorView::modelAttached(Model *model)
@@ -686,17 +683,27 @@ void PropertyEditorView::nodeIdChanged(const ModelNode& node, const QString& new
} }
} }
void PropertyEditorView::select(const ModelNode &node) void PropertyEditorView::select()
{ {
if (m_qmlBackEndForCurrentType) if (m_qmlBackEndForCurrentType)
m_qmlBackEndForCurrentType->emitSelectionToBeChanged(); m_qmlBackEndForCurrentType->emitSelectionToBeChanged();
if (QmlObjectNode(node).isValid()) delayedResetView();
m_selectedNode = node; }
else
void PropertyEditorView::setSelelectedModelNode()
{
const auto selectedNodeList = selectedModelNodes();
m_selectedNode = ModelNode(); m_selectedNode = ModelNode();
delayedResetView(); if (selectedNodeList.isEmpty())
return;
const ModelNode node = selectedNodeList.constFirst();
if (QmlObjectNode(node).isValid())
m_selectedNode = node;
} }
bool PropertyEditorView::hasWidget() const bool PropertyEditorView::hasWidget() const

View File

@@ -105,7 +105,8 @@ private: //functions
void updateSize(); void updateSize();
void setupPanes(); void setupPanes();
void select(const ModelNode& node); void select();
void setSelelectedModelNode();
void delayedResetView(); void delayedResetView();
void setupQmlBackend(); void setupQmlBackend();