📄 abstractformbuilder.cpp
字号:
} foreach (DomActionRef *ui_action_ref, ui_widget->elementAddAction()) { QString name = ui_action_ref->attributeName(); if (name == QLatin1String("separator")) { QAction *sep = new QAction(w); sep->setSeparator(true); w->addAction(sep); addMenuAction(sep); } else if (QAction *a = m_actions.value(name)) { w->addAction(a); } else if (QActionGroup *g = m_actionGroups.value(name)) { w->addActions(g->actions()); } else if (QMenu *menu = qFindChild<QMenu*>(w, name)) { w->addAction(menu->menuAction()); addMenuAction(menu->menuAction()); } } loadExtraInfo(ui_widget, w, parentWidget); addItem(ui_widget, w, parentWidget); if (qobject_cast<QDialog *>(w) && parentWidget) w->setAttribute(Qt::WA_Moved, false); // So that QDialog::setVisible(true) will center it return w;}/*! \internal*/QAction *QAbstractFormBuilder::create(DomAction *ui_action, QObject *parent){ QAction *a = createAction(parent, ui_action->attributeName()); if (!a) return 0; applyProperties(a, ui_action->elementProperty()); return a;}/*! \internal*/QActionGroup *QAbstractFormBuilder::create(DomActionGroup *ui_action_group, QObject *parent){ QActionGroup *a = createActionGroup(parent, ui_action_group->attributeName()); if (!a) return 0; applyProperties(a, ui_action_group->elementProperty()); foreach (DomAction *ui_action, ui_action_group->elementAction()) { QAction *child_action = create(ui_action, a); Q_UNUSED( child_action ); } foreach (DomActionGroup *g, ui_action_group->elementActionGroup()) { QActionGroup *child_action_group = create(g, parent); Q_UNUSED( child_action_group ); } return a;}/*! \internal*/bool QAbstractFormBuilder::addItem(DomWidget *ui_widget, QWidget *widget, QWidget *parentWidget){ QHash<QString, DomProperty*> attributes = propertyMap(ui_widget->elementAttribute()); QString title = QLatin1String("Page"); if (DomProperty *ptitle = attributes.value(QLatin1String("title"))) { title = toString(ptitle->elementString()); } QString label = QLatin1String(QLatin1String("Page")); if (DomProperty *plabel = attributes.value(QLatin1String("label"))) { label = toString(plabel->elementString()); } if (QMainWindow *mw = qobject_cast<QMainWindow*>(parentWidget)) { // the menubar if (QMenuBar *menuBar = qobject_cast<QMenuBar*>(widget)) { mw->setMenuBar(menuBar); return true; } // apply the toolbar's attributes else if (QToolBar *toolBar = qobject_cast<QToolBar*>(widget)) { if (DomProperty *attr = attributes.value(QLatin1String("toolBarArea"))) { Qt::ToolBarArea area = static_cast<Qt::ToolBarArea>(attr->elementNumber()); mw->addToolBar(area, toolBar); } else { mw->addToolBar(toolBar); } return true; } // statusBar else if (QStatusBar *statusBar = qobject_cast<QStatusBar*>(widget)) { mw->setStatusBar(statusBar); return true; } // apply the dockwidget's attributes else if (QDockWidget *dockWidget = qobject_cast<QDockWidget*>(widget)) { if (DomProperty *attr = attributes.value(QLatin1String("dockWidgetArea"))) { Qt::DockWidgetArea area = static_cast<Qt::DockWidgetArea>(attr->elementNumber()); 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); 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 (DomProperty *ptoolTip = attributes.value(QLatin1String("toolTip"))) { tabWidget->setTabToolTip(tabIndex, toString(ptoolTip->elementString())); } return true; } else if (QToolBox *toolBox = qobject_cast<QToolBox*>(parentWidget)) { 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 (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){ QHash<QString, DomProperty*> properties = propertyMap(ui_layout->elementProperty()); if (margin) *margin = properties.contains(QLatin1String("margin")) ? properties.value(QLatin1String("margin"))->elementNumber() : m_defaultMargin; if (spacing) *spacing = properties.contains(QLatin1String("spacing")) ? properties.value(QLatin1String("spacing"))->elementNumber() : m_defaultSpacing; if (margin && m_defaultMargin == INT_MIN) { Q_ASSERT(parent); if (qstrcmp(parent->metaObject()->className(), "QLayoutWidget") == 0) *margin = INT_MIN; }}/*! \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); if (spacing != INT_MIN) layout->setSpacing(spacing); 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)) { int rowSpan = ui_item->hasAttributeRowSpan() ? ui_item->attributeRowSpan() : 1; 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; DomSpacer *ui_spacer = ui_layoutItem->elementSpacer(); int e_index = QAbstractFormBuilderGadget::staticMetaObject.indexOfProperty("sizeType"); Q_ASSERT(e_index != -1); QMetaEnum sizePolicy_enum = QAbstractFormBuilderGadget::staticMetaObject.property(e_index).enumerator(); e_index = QAbstractFormBuilderGadget::staticMetaObject.indexOfProperty("orientation"); Q_ASSERT(e_index != -1); QMetaEnum orientation_enum = QAbstractFormBuilderGadget::staticMetaObject.property(e_index).enumerator(); foreach (DomProperty *p, ui_spacer->elementProperty()) { 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 = static_cast<QSizePolicy::Policy>(sizePolicy_enum.keyToValue(p->elementEnum().toUtf8())); } else if (p->attributeName() == QLatin1String("orientation") && p->kind() == DomProperty::Enum) { Qt::Orientation o = static_cast<Qt::Orientation>(orientation_enum.keyToValue(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){ foreach (DomProperty *p, properties) { QVariant v = toVariant(o->metaObject(), p); if (!v.isNull()) o->setProperty(p->attributeName().toUtf8(), v); }}/*! \internal*/QVariant QAbstractFormBuilder::toVariant(const QMetaObject *meta, DomProperty *p){ QVariant v; switch(p->kind()) { case DomProperty::Bool: { v = toBool(p->elementBool()); } break; case DomProperty::Cstring: { v = p->elementCstring(); } break; case DomProperty::Point: { DomPoint *point = p->elementPoint(); QPoint pt(point->elementX(), point->elementY()); v = QVariant(pt); } break; case DomProperty::Size: { DomSize *size = p->elementSize(); QSize sz(size->elementWidth(), size->elementHeight()); v = QVariant(sz); } break; case DomProperty::Rect: { DomRect *rc = p->elementRect(); QRect g(rc->elementX(), rc->elementY(), rc->elementWidth(), rc->elementHeight()); v = QVariant(g); } break; case DomProperty::String: { int index = meta->indexOfProperty(p->attributeName().toUtf8()); if (index != -1 && meta->property(index).type() == QVariant::KeySequence) v = qVariantFromValue(QKeySequence(p->elementString()->text())); else v = p->elementString()->text(); } break; case DomProperty::Number: { v = p->elementNumber(); } break; case DomProperty::Double: { v = p->elementDouble(); } break; case DomProperty::Color: { DomColor *color = p->elementColor(); QColor c(color->elementRed(), color->elementGreen(), color->elementBlue()); v = qVariantFromValue(c); } break; case DomProperty::Font: { DomFont *font = p->elementFont(); QFont f; if (!font->elementFamily().isEmpty()) f.setFamily(font->elementFamily()); if (font->elementPointSize() > 0) f.setPointSize(font->elementPointSize()); if (font->elementWeight() > 0) f.setWeight(font->elementWeight());
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -