コード例 #1
0
// 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;
}
コード例 #2
0
// 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;
}