// Convenience to create a Dom Widget from widget box xml code. DomUI *QDesignerWidgetBox::xmlToUi(const QString &name, const QString &xml, bool insertFakeTopLevel, QString *errorMessage) { QXmlStreamReader reader(xml); DomUI *ui = 0; // The xml description must either contain a root element "ui" with a child element "widget" // or "widget" as the root element (4.3 legacy) const QString widgetTag = QLatin1String("widget"); while (!reader.atEnd()) { if (reader.readNext() == QXmlStreamReader::StartElement) { const QStringRef name = reader.name(); if (ui) { reader.raiseError(tr("Unexpected element <%1>").arg(name.toString())); continue; } if (name.compare(QLatin1String("widget"), Qt::CaseInsensitive) == 0) { // 4.3 legacy, wrap into DomUI ui = new DomUI; DomWidget *widget = new DomWidget; widget->read(reader); ui->setElementWidget(widget); } else if (name.compare(QLatin1String("ui"), Qt::CaseInsensitive) == 0) { // 4.4 ui = new DomUI; ui->read(reader); } else { reader.raiseError(tr("Unexpected element <%1>").arg(name.toString())); } } } if (reader.hasError()) { delete ui; *errorMessage = tr("A parse error occurred at line %1, column %2 of the XML code " "specified for the widget %3: %4\n%5") .arg(reader.lineNumber()).arg(reader.columnNumber()).arg(name) .arg(reader.errorString()).arg(xml); return 0; } if (!ui || !ui->elementWidget()) { delete ui; *errorMessage = tr("The XML code specified for the widget %1 does not contain " "any widget elements.\n%2").arg(name).arg(xml); return 0; } if (insertFakeTopLevel) { DomWidget *fakeTopLevel = new DomWidget; fakeTopLevel->setAttributeClass(QLatin1String("QWidget")); QList<DomWidget *> children; children.push_back(ui->takeElementWidget()); fakeTopLevel->setElementWidget(children); ui->setElementWidget(fakeTopLevel); } return ui; }
// Convenience to create a Dom Widget from widget box xml code. DomUI *QDesignerWidgetBox::xmlToUi(const QString &name, const QString &xml, bool insertFakeTopLevel, QString *errorMessage) { QDomDocument doc; int errorLine, errorColumn; if (!doc.setContent(xml, errorMessage, &errorLine, &errorColumn)) { *errorMessage = QObject::tr("A parse error occurred at line %1, column %2 of the XML code specified for the widget %3: %4\n%5"). arg(errorLine).arg(errorColumn).arg(name).arg(*errorMessage).arg(xml); return 0; } if (!doc.hasChildNodes()) { *errorMessage = QObject::tr("The XML code specified for the widget %1 does not contain any widget elements.\n%2").arg(name).arg(xml); return 0; } QDomElement rootElement = doc.firstChildElement(); const QString rootNode = rootElement.nodeName(); const QString widgetTag = QLatin1String("widget"); if (rootNode == widgetTag) { // 4.3 legacy ,wrap into DomUI DomUI *rc = new DomUI; DomWidget *widget = new DomWidget; widget->read(rootElement); if (insertFakeTopLevel) { DomWidget *fakeTopLevel = new DomWidget; QList<DomWidget *> children; children.push_back(widget); fakeTopLevel->setElementWidget(children); rc->setElementWidget(fakeTopLevel); } else { rc->setElementWidget(widget); } return rc; } if (rootNode == QLatin1String("ui")) { // 4.4 QDomElement widgetChild = rootElement.firstChildElement(widgetTag); if (widgetChild.isNull()) { *errorMessage = QObject::tr("The XML code specified for the widget %1 does not contain valid widget element\n%2").arg(name).arg(xml); return 0; } if (insertFakeTopLevel) { QDomElement fakeTopLevel = doc.createElement(widgetTag); rootElement.replaceChild(fakeTopLevel, widgetChild); fakeTopLevel.appendChild(widgetChild); } DomUI *rc = new DomUI; rc->read(rootElement); return rc; } *errorMessage = QObject::tr("The XML code specified for the widget %1 contains an invalid root element %2.\n%3").arg(name).arg(rootNode).arg(xml); return 0; }