diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2018-07-09 13:35:57 +0200 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2018-07-10 12:49:50 +0000 |
commit | 41342facfa10a6a69ec6e23e629975cd0263e39e (patch) | |
tree | d23d316a9efcbc2aa7594e95f31709f676eac6f6 /src/designer/src/components/formeditor/qdesigner_resource.cpp | |
parent | a5fffeba866e259f8435ec1c975edb3d80d3632f (diff) |
Qt Designer: Fix Qt Creator crashes on reloading malformed UI files
Extract the functionality to read the DomUI with version check
to QFormBuilderExtra so that the reading can be split into DomUI
and widget creation.
In FormWindow, check the success of the DomUI creation before
modifying Qt Designer's internal state.
Task-number: QTCREATORBUG-20742
Change-Id: I095f80e90966eba67d8994cd68e83c3e11aa0ee9
Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io>
Diffstat (limited to 'src/designer/src/components/formeditor/qdesigner_resource.cpp')
-rw-r--r-- | src/designer/src/components/formeditor/qdesigner_resource.cpp | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/src/designer/src/components/formeditor/qdesigner_resource.cpp b/src/designer/src/components/formeditor/qdesigner_resource.cpp index b799e648c..caca4d497 100644 --- a/src/designer/src/components/formeditor/qdesigner_resource.cpp +++ b/src/designer/src/components/formeditor/qdesigner_resource.cpp @@ -461,6 +461,11 @@ QDesignerResource::~QDesignerResource() { } +DomUI *QDesignerResource::readUi(QIODevice *dev) +{ + return d->readUi(dev); +} + static inline QString messageBoxTitle() { return QApplication::translate("Designer", "Qt Designer"); @@ -596,10 +601,19 @@ void QDesignerResource::saveDom(DomUI *ui, QWidget *widget) QWidget *QDesignerResource::load(QIODevice *dev, QWidget *parentWidget) { - QWidget *w = QEditorFormBuilder::load(dev, parentWidget); - if (w) // Store the class name as 'reset' value for the main container's object name. - w->setProperty("_q_classname", w->objectName()); - return w; + QScopedPointer<DomUI> ui(readUi(dev)); + return ui.isNull() ? nullptr : loadUi(ui.data(), parentWidget); +} + +QWidget *QDesignerResource::loadUi(DomUI *ui, QWidget *parentWidget) +{ + QWidget *widget = create(ui, parentWidget); + // Store the class name as 'reset' value for the main container's object name. + if (widget) + widget->setProperty("_q_classname", widget->objectName()); + else if (d->m_errorString.isEmpty()) + d->m_errorString = QFormBuilderExtra::msgInvalidUiFile(); + return widget; } bool QDesignerResource::saveRelative() const |