summaryrefslogtreecommitdiffstats
path: root/src/designer/src/components/formeditor/qdesigner_resource.cpp
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2018-07-09 13:35:57 +0200
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2018-07-10 12:49:50 +0000
commit41342facfa10a6a69ec6e23e629975cd0263e39e (patch)
treed23d316a9efcbc2aa7594e95f31709f676eac6f6 /src/designer/src/components/formeditor/qdesigner_resource.cpp
parenta5fffeba866e259f8435ec1c975edb3d80d3632f (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.cpp22
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