abstractformbuilder.cpp

来自「奇趣公司比较新的qt/emd版本」· C++ 代码 · 共 2,006 行 · 第 1/5 页

CPP
2,006
字号
                    if (dockWidget->isAreaAllowed(Qt::LeftDockWidgetArea))                        area = Qt::LeftDockWidgetArea;                    else if (dockWidget->isAreaAllowed(Qt::RightDockWidgetArea))                        area = Qt::RightDockWidgetArea;                    else if (dockWidget->isAreaAllowed(Qt::TopDockWidgetArea))                        area = Qt::TopDockWidgetArea;                    else if (dockWidget->isAreaAllowed(Qt::BottomDockWidgetArea))                        area = Qt::BottomDockWidgetArea;                }                mw->addDockWidget(area, dockWidget);            } else {                mw->addDockWidget(Qt::LeftDockWidgetArea, dockWidget);            }            return true;        }        else if (! mw->centralWidget()) {            mw->setCentralWidget(widget);            return true;        }    }    else if (QTabWidget *tabWidget = qobject_cast<QTabWidget*>(parentWidget)) {        widget->setParent(0);        const int tabIndex = tabWidget->count();        tabWidget->addTab(widget, title);        if (DomProperty *picon = attributes.value(QLatin1String("icon"))) {            tabWidget->setTabIcon(tabIndex, qvariant_cast<QIcon>(toVariant(0, picon)));        }        if (const DomProperty *ptoolTip = attributes.value(QLatin1String("toolTip"))) {            tabWidget->setTabToolTip(tabIndex, toString(ptoolTip->elementString()));        }        return true;    }    else if (QToolBox *toolBox = qobject_cast<QToolBox*>(parentWidget)) {        const int tabIndex = toolBox->count();        toolBox->addItem(widget, label);        if (DomProperty *picon = attributes.value(QLatin1String("icon"))) {            toolBox->setItemIcon(tabIndex, qvariant_cast<QIcon>(toVariant(0, picon)));        }        if (const DomProperty *ptoolTip = attributes.value(QLatin1String("toolTip"))) {            toolBox->setItemToolTip(tabIndex, toString(ptoolTip->elementString()));        }        return true;    }    else if (QStackedWidget *stackedWidget = qobject_cast<QStackedWidget*>(parentWidget)) {        stackedWidget->addWidget(widget);        return true;    }    else if (QSplitter *splitter = qobject_cast<QSplitter*>(parentWidget)) {        splitter->addWidget(widget);        return true;    }    else if (QDockWidget *dockWidget = qobject_cast<QDockWidget*>(parentWidget)) {        dockWidget->setWidget(widget);        return true;    }    return false;}/*!    \internal*/void QAbstractFormBuilder::layoutInfo(DomLayout *ui_layout, QObject *parent, int *margin, int *spacing){    Q_UNUSED(parent)    const DomPropertyHash properties = propertyMap(ui_layout->elementProperty());    int mar = INT_MIN;    int spac = INT_MIN;    if (properties.contains(QLatin1String("margin")))        mar = properties.value(QLatin1String("margin"))->elementNumber();    if (properties.contains(QLatin1String("spacing")))        spac = properties.value(QLatin1String("spacing"))->elementNumber();#ifdef Q_OS_MAC    // here we recognize ui file < 4.3 (no we don't store margin property)    if (mar != INT_MIN) {        int defaultMargin = 9;        if (parent->inherits("QLayoutWidget"))            defaultMargin = 0;        if (mar == defaultMargin)            mar = INT_MIN;        if (spac == 6)            spac = INT_MIN;        if (mar == INT_MIN || spac == INT_MIN) {            QList<DomProperty *> properties = ui_layout->elementProperty();            QMutableListIterator<DomProperty *> it(properties);            while (it.hasNext()) {                DomProperty *prop = it.next();                if ((mar == INT_MIN && prop->attributeName() == QLatin1String("margin")) ||                        (spac == INT_MIN && prop->attributeName() == QLatin1String("spacing"))) {                    it.remove();                    delete prop;                }            }            ui_layout->setElementProperty(properties);        }    }#endif    if (margin)        *margin = mar;    if (spacing)        *spacing = spac;}/*!    \internal*/QLayout *QAbstractFormBuilder::create(DomLayout *ui_layout, QLayout *parentLayout, QWidget *parentWidget){    QObject *p = parentLayout;    if (p == 0)        p = parentWidget;    Q_ASSERT(p != 0);    bool tracking = false;    if (p == parentWidget && parentWidget->layout()) {        tracking = true;        p = parentWidget->layout();    }    QLayout *layout = createLayout(ui_layout->attributeClass(), p, QString());    if (layout == 0)        return 0;    if (tracking && layout->parent() == 0) {        QBoxLayout *box = qobject_cast<QBoxLayout*>(parentWidget->layout());        Q_ASSERT(box != 0); // only QBoxLayout is supported        box->addLayout(layout);    }    int margin = INT_MIN, spacing = INT_MIN;    layoutInfo(ui_layout, p, &margin, &spacing);    if (margin != INT_MIN) {        layout->setMargin(margin);    } else {        int left, top, right, bottom;        left = top = right = bottom = -1;        layout->getContentsMargins(&left, &top, &right, &bottom);        const DomPropertyHash properties = propertyMap(ui_layout->elementProperty());        if (properties.contains(QLatin1String("leftMargin")))            left = properties.value(QLatin1String("leftMargin"))->elementNumber();        if (properties.contains(QLatin1String("topMargin")))            top = properties.value(QLatin1String("topMargin"))->elementNumber();        if (properties.contains(QLatin1String("rightMargin")))            right = properties.value(QLatin1String("rightMargin"))->elementNumber();        if (properties.contains(QLatin1String("bottomMargin")))            bottom = properties.value(QLatin1String("bottomMargin"))->elementNumber();        layout->setContentsMargins(left, top, right, bottom);    }    if (spacing != INT_MIN) {        layout->setSpacing(spacing);    } else {        QGridLayout *grid = qobject_cast<QGridLayout *>(layout);        if (grid) {            const DomPropertyHash properties = propertyMap(ui_layout->elementProperty());            if (properties.contains(QLatin1String("horizontalSpacing")))                grid->setHorizontalSpacing(properties.value(QLatin1String("horizontalSpacing"))->elementNumber());            if (properties.contains(QLatin1String("verticalSpacing")))                grid->setVerticalSpacing(properties.value(QLatin1String("verticalSpacing"))->elementNumber());        }    }    applyProperties(layout, ui_layout->elementProperty());    foreach (DomLayoutItem *ui_item, ui_layout->elementItem()) {        if (QLayoutItem *item = create(ui_item, layout, parentWidget)) {            addItem(ui_item, item, layout);        }    }    return layout;}/*!    \internal*/bool QAbstractFormBuilder::addItem(DomLayoutItem *ui_item, QLayoutItem *item, QLayout *layout){    if (item->widget()) {        static_cast<QFriendlyLayout*>(layout)->addChildWidget(item->widget());    } else if (item->layout()) {        static_cast<QFriendlyLayout*>(layout)->addChildLayout(item->layout());    } else if (item->spacerItem()) {        // nothing to do    } else {        return false;    }    if (QGridLayout *grid = qobject_cast<QGridLayout*>(layout)) {        const int rowSpan = ui_item->hasAttributeRowSpan() ? ui_item->attributeRowSpan() : 1;        const int colSpan = ui_item->hasAttributeColSpan() ? ui_item->attributeColSpan() : 1;        grid->addItem(item, ui_item->attributeRow(), ui_item->attributeColumn(),                        rowSpan, colSpan, item->alignment());    } else {        layout->addItem(item);    }    return true;}/*!    \internal*/QLayoutItem *QAbstractFormBuilder::create(DomLayoutItem *ui_layoutItem, QLayout *layout, QWidget *parentWidget){    switch (ui_layoutItem->kind()) {    case DomLayoutItem::Widget:        return new QWidgetItem(create(ui_layoutItem->elementWidget(), parentWidget));    case DomLayoutItem::Spacer: {        QSize size(0, 0);        QSizePolicy::Policy sizeType = QSizePolicy::Expanding;        bool isVspacer = false;        const DomSpacer *ui_spacer = ui_layoutItem->elementSpacer();        const QMetaEnum sizePolicy_enum  = metaEnum<QAbstractFormBuilderGadget>("sizeType");        const QMetaEnum orientation_enum =  metaEnum<QAbstractFormBuilderGadget>("orientation");        foreach (DomProperty *p, ui_spacer->elementProperty()) {            const QVariant v = toVariant(&QAbstractFormBuilderGadget::staticMetaObject, p); // ### remove me            if (v.isNull())                continue;            if (p->attributeName() == QLatin1String("sizeHint") && p->kind() == DomProperty::Size) {                size = v.toSize();  // ###  remove me            } else if (p->attributeName() == QLatin1String("sizeType") && p->kind() == DomProperty::Enum) {                sizeType = enumKeyToValue<QSizePolicy::Policy>(sizePolicy_enum, p->elementEnum().toUtf8());            } else if (p->attributeName() == QLatin1String("orientation") && p->kind() == DomProperty::Enum) {                const Qt::Orientation o = enumKeyToValue<Qt::Orientation>(orientation_enum, p->elementEnum().toUtf8());                isVspacer = (o == Qt::Vertical);            }        }        QSpacerItem *spacer = 0;        if (isVspacer)            spacer = new QSpacerItem(size.width(), size.height(), QSizePolicy::Minimum, sizeType);        else            spacer = new QSpacerItem(size.width(), size.height(), sizeType, QSizePolicy::Minimum);        return spacer; }    case DomLayoutItem::Layout:        return create(ui_layoutItem->elementLayout(), layout, parentWidget);    default:        break;    }    return 0;}/*!    \internal*/void QAbstractFormBuilder::applyProperties(QObject *o, const QList<DomProperty*> &properties){    typedef QList<DomProperty*> DomPropertyList;    if (properties.empty())        return;    QFormBuilderExtra *fb = QFormBuilderExtra::instance(this);    const DomPropertyList::const_iterator cend = properties.constEnd();    for (DomPropertyList::const_iterator it = properties.constBegin(); it != cend; ++it) {        const QVariant v = toVariant(o->metaObject(), *it);        if (!v.isNull()) {            const  QString attributeName = (*it)->attributeName();            if (!fb->applyPropertyInternally(o, attributeName, v))                o->setProperty(attributeName.toUtf8(), v);        }    }}/*!    \internal    Check whether a property is applied internally by QAbstractFormBuilder. Call this   from overwritten applyProperties().*/bool QAbstractFormBuilder::applyPropertyInternally(QObject *o, const QString &propertyName, const QVariant &value){    return QFormBuilderExtra::instance(this)->applyPropertyInternally(o,propertyName, value);}/*!    \internal*/QVariant QAbstractFormBuilder::toVariant(const QMetaObject *meta, DomProperty *p){    return domPropertyToVariant(this, meta, p);}/*!    \internal*/void QAbstractFormBuilder::setupColorGroup(QPalette &palette, QPalette::ColorGroup colorGroup,            DomColorGroup *group){    // old format    const QList<DomColor*> colors = group->elementColor();    for (int role = 0; role < colors.size(); ++role) {        const DomColor *color = colors.at(role);        const QColor c(color->elementRed(), color->elementGreen(), color->elementBlue());        palette.setColor(colorGroup, QPalette::ColorRole(role), c);    }    // new format    const QMetaEnum colorRole_enum = metaEnum<QAbstractFormBuilderGadget>("colorRole");    const QList<DomColorRole*> colorRoles = group->elementColorRole();    for (int role = 0; role < colorRoles.size(); ++role) {        const DomColorRole *colorRole = colorRoles.at(role);        if (colorRole->hasAttributeRole()) {            const int r = colorRole_enum.keyToValue(colorRole->attributeRole().toLatin1());            if (r != -1) {                const QBrush br = setupBrush(colorRole->elementBrush());                palette.setBrush(colorGroup, static_cast<QPalette::ColorRole>(r), br);            }        }    }}/*!    \internal*/DomColorGroup *QAbstractFormBuilder::saveColorGroup(const QPalette &palette){    const QMetaEnum colorRole_enum = metaEnum<QAbstractFormBuilderGadget>("colorRole");    DomColorGroup *group = new DomColorGroup();    QList<DomColorRole*> colorRoles;    const uint mask = palette.resolve();    for (int role = QPalette::WindowText; role < QPalette::NColorRoles; ++role) {        if (mask & (1 << role)) {            QBrush br = palette.brush(QPalette::ColorRole(role));            DomColorRole *colorRole = new DomColorRole();            colorRole->setElementBrush(saveBrush(br));            colorRole->setAttributeRole(QLatin1String(colorRole_enum.valueToKey(role)));            colorRoles.append(colorRole);        }    }    group->setElementColorRole(colorRoles);    return group;}/*!    \internal*/QBrush QAbstractFormBuilder::setupBrush(DomBrush *brush){    QBrush br;    if (!brush->hasAttributeBrushStyle())        return br;    const Qt::BrushStyle style = enumKeyOfObjectToValue<QAbstractFormBuilderGadget, Qt::BrushStyle>("brushStyle", brush->attributeBrushStyle().toLatin1());    if (style == Qt::LinearGradientPattern ||            style == Qt::RadialGradientPattern ||            style == Qt::ConicalGradientPattern) {        const QMetaEnum gradientType_enum = metaEnum<QAbstractFormBuilderGadget>("gradientType");        const QMetaEnum gradientSpread_enum = metaEnum<QAbstractFormBuilderGadget>("gradientSpread");        const QMetaEnum gradientCoordinate_enum = metaEnum<QAbstractFormBuilderGadget>("gradientCoordinate");        const DomGradient *gradient = brush->elementGradient();        const QGradient::Type type = enumKeyToValue<QGradient::Type>(gradientType_enum, gradient->attributeType().toLatin1());

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?