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 + -
显示快捷键?