184 d->m_defaultMargin = def->hasAttributeMargin() ? def->attributeMargin() : INT_MIN;
185 d->m_defaultSpacing = def->hasAttributeSpacing() ? def->attributeSpacing() : INT_MIN;
188 DomWidget *ui_widget = ui->elementWidget();
194 if (
const DomButtonGroups *domButtonGroups = ui->elementButtonGroups())
195 d->registerButtonGroups(domButtonGroups);
197 if (QWidget *widget = create(ui_widget, parentWidget)) {
199 for (
const auto &bg : std::as_const(d->buttonGroups())) {
201 bg.second->setParent(widget);
203 createConnections(ui->elementConnections(), widget);
204 createResources(ui->elementResources());
205 applyTabStops(widget, ui->elementTabStops());
206 d->applyInternalProperties();
216
217
218
219
220
222void QAbstractFormBuilder::initialize(
const DomUI *ui)
224 DomCustomWidgets *domCustomWidgets = ui->elementCustomWidgets();
225 createCustomWidgets(domCustomWidgets);
227 if (domCustomWidgets) {
228 const auto &customWidgets = domCustomWidgets->elementCustomWidget();
229 for (
const DomCustomWidget *w : customWidgets)
230 d->storeCustomWidgetData(w->elementClass(), w);
235
236
237QWidget *QAbstractFormBuilder::create(DomWidget *ui_widget, QWidget *parentWidget)
239 QWidget *w = createWidget(ui_widget->attributeClass(), parentWidget, ui_widget->attributeName());
243 applyProperties(w, ui_widget->elementProperty());
245 const auto &elementAction = ui_widget->elementAction();
246 for (DomAction *ui_action : elementAction) {
247 QAction *child_action = create(ui_action, w);
248 Q_UNUSED( child_action );
251 const auto &elementActionGroup = ui_widget->elementActionGroup();
252 for (DomActionGroup *ui_action_group : elementActionGroup) {
253 QActionGroup *child_action_group = create(ui_action_group, w);
254 Q_UNUSED( child_action_group );
257 QWidgetList children;
258 const auto &elementWidget = ui_widget->elementWidget();
259 for (DomWidget *ui_child : elementWidget) {
260 if (QWidget *child = create(ui_child, w)) {
263 const QString className = ui_child->elementClass().value(0);
264 uiLibWarning(QCoreApplication::translate(
"QAbstractFormBuilder",
"The creation of a widget of the class '%1' failed.").arg(className));
268 const auto &elementLayout = ui_widget->elementLayout();
269 for (DomLayout *ui_lay : elementLayout) {
270 QLayout *child_lay = create(ui_lay,
nullptr, w);
271 Q_UNUSED( child_lay );
274 const auto &addActions = ui_widget->elementAddAction();
275 if (!addActions.isEmpty()) {
276 for (DomActionRef *ui_action_ref : addActions) {
277 const QString name = ui_action_ref->attributeName();
278 if (name ==
"separator"_L1) {
279 auto *sep =
new QAction(w);
280 sep->setSeparator(
true);
283 }
else if (QAction *a = d->m_actions.value(name)) {
285 }
else if (QActionGroup *g = d->m_actionGroups.value(name)) {
286 w->addActions(g->actions());
287 }
else if (
auto *menu = w->findChild<QMenu*>(name)) {
288 w->addAction(menu->menuAction());
289 addMenuAction(menu->menuAction());
294 loadExtraInfo(ui_widget, w, parentWidget);
295 addItem(ui_widget, w, parentWidget);
297 if (qobject_cast<QDialog *>(w) && parentWidget)
298 w->setAttribute(Qt::WA_Moved,
false);
300 const QStringList zOrderNames = ui_widget->elementZOrder();
301 if (!zOrderNames.isEmpty()) {
302 auto zOrder = qvariant_cast<QWidgetList>(w->property(
"_q_zOrder"));
303 for (
const QString &widgetName : zOrderNames) {
304 if (
auto *child = w->findChild<QWidget*>(widgetName)) {
305 if (child->parentWidget() == w) {
306 zOrder.removeAll(child);
307 zOrder.append(child);
312 w->setProperty(
"_q_zOrder", QVariant::fromValue(zOrder));
319
320
321QAction *QAbstractFormBuilder::create(DomAction *ui_action, QObject *parent)
323 QAction *a = createAction(parent, ui_action->attributeName());
327 d->m_actions.insert(ui_action->attributeName(), a);
328 applyProperties(a, ui_action->elementProperty());
333
334
335QActionGroup *QAbstractFormBuilder::create(DomActionGroup *ui_action_group, QObject *parent)
337 QActionGroup *a = createActionGroup(parent, ui_action_group->attributeName());
340 d->m_actionGroups.insert(ui_action_group->attributeName(), a);
341 applyProperties(a, ui_action_group->elementProperty());
343 const auto &elementAction = ui_action_group->elementAction();
344 for (DomAction *ui_action : elementAction) {
345 QAction *child_action = create(ui_action, a);
346 Q_UNUSED( child_action );
349 const auto &elementActionGroup = ui_action_group->elementActionGroup();
350 for (DomActionGroup *g : elementActionGroup) {
351 QActionGroup *child_action_group = create(g, parent);
352 Q_UNUSED( child_action_group );
360Qt::ToolBarArea QAbstractFormBuilder::toolbarAreaFromDOMAttributes(
const DomPropertyHash &attributes)
362 const DomProperty *attr = attributes.value(
"toolBarArea"_L1);
364 return Qt::TopToolBarArea;
365 switch(attr->kind()) {
366 case DomProperty::Number:
367 return static_cast<Qt::ToolBarArea>(attr->elementNumber());
368 case DomProperty::Enum:
369 return enumKeyOfObjectToValue<QAbstractFormBuilderGadget, Qt::ToolBarArea>(
"toolBarArea",
370 attr->elementEnum().toLatin1().constData());
374 return Qt::TopToolBarArea;
378
379
380bool QAbstractFormBuilder::addItem(DomWidget *ui_widget, QWidget *widget, QWidget *parentWidget)
382 const DomPropertyHash attributes = propertyMap(ui_widget->elementAttribute());
384 if (parentWidget ==
nullptr)
387 const QString className = QLatin1StringView(parentWidget->metaObject()->className());
388 const QString addPageMethod = d->customWidgetAddPageMethod(className);
389 if (!addPageMethod.isEmpty()) {
391 return QMetaObject::invokeMethod(parentWidget, addPageMethod.toUtf8().constData(), Qt::DirectConnection, Q_ARG(QWidget*, widget));
394 if (
auto *mw = qobject_cast<QMainWindow*>(parentWidget)) {
396#if QT_CONFIG(menubar)
398 if (
auto *menuBar = qobject_cast<QMenuBar*>(widget)) {
399 mw->setMenuBar(menuBar);
404#if QT_CONFIG(toolbar)
406 if (
auto *toolBar = qobject_cast<QToolBar*>(widget)) {
407 mw->addToolBar(toolbarAreaFromDOMAttributes(attributes), toolBar);
409 if (
const DomProperty *attr = attributes.value(
"toolBarBreak"_L1))
410 if (attr->elementBool() ==
"true"_L1)
411 mw->insertToolBarBreak (toolBar);
417#if QT_CONFIG(statusbar)
419 if (
auto *statusBar = qobject_cast<QStatusBar*>(widget)) {
420 mw->setStatusBar(statusBar);
425#if QT_CONFIG(dockwidget)
427 if (
auto *dockWidget = qobject_cast<QDockWidget*>(widget)) {
428 if (
const DomProperty *attr = attributes.value(
"dockWidgetArea"_L1)) {
429 auto area =
static_cast<Qt::DockWidgetArea>(attr->elementNumber());
430 if (!dockWidget->isAreaAllowed(area)) {
431 if (dockWidget->isAreaAllowed(Qt::LeftDockWidgetArea))
432 area = Qt::LeftDockWidgetArea;
433 else if (dockWidget->isAreaAllowed(Qt::RightDockWidgetArea))
434 area = Qt::RightDockWidgetArea;
435 else if (dockWidget->isAreaAllowed(Qt::TopDockWidgetArea))
436 area = Qt::TopDockWidgetArea;
437 else if (dockWidget->isAreaAllowed(Qt::BottomDockWidgetArea))
438 area = Qt::BottomDockWidgetArea;
440 mw->addDockWidget(area, dockWidget);
442 mw->addDockWidget(Qt::LeftDockWidgetArea, dockWidget);
448 if (!mw->centralWidget()) {
449 mw->setCentralWidget(widget);
454#if QT_CONFIG(tabwidget)
455 else if (
auto *tabWidget = qobject_cast<QTabWidget*>(parentWidget)) {
456 widget->setParent(
nullptr);
458 const int tabIndex = tabWidget->count();
459 if (
auto *titleP = attributes.value(QFormBuilderStrings::titleAttribute))
460 tabWidget->addTab(widget, toString(titleP->elementString()));
462 tabWidget->addTab(widget,
"Page"_L1);
464 if (
const auto *picon = attributes.value(QFormBuilderStrings::iconAttribute)) {
465 QVariant v = resourceBuilder()->loadResource(workingDirectory(), picon);
466 QVariant nativeValue = resourceBuilder()->toNativeValue(v);
467 tabWidget->setTabIcon(tabIndex, qvariant_cast<QIcon>(nativeValue));
470#if QT_CONFIG(tooltip)
471 if (
const auto *ptoolTip = attributes.value(QFormBuilderStrings::toolTipAttribute)) {
472 tabWidget->setTabToolTip(tabIndex, toString(ptoolTip->elementString()));
476#if QT_CONFIG(whatsthis)
477 if (
const auto *pwhatsThis = attributes.value(QFormBuilderStrings::whatsThisAttribute)) {
478 tabWidget->setTabWhatsThis(tabIndex, toString(pwhatsThis->elementString()));
486#if QT_CONFIG(toolbox)
487 else if (
auto *toolBox = qobject_cast<QToolBox*>(parentWidget)) {
488 const int tabIndex = toolBox->count();
489 if (
const auto *labelP = attributes.value(QFormBuilderStrings::labelAttribute))
490 toolBox->addItem(widget, toString(labelP->elementString()));
492 toolBox->addItem(widget,
"Page"_L1);
494 if (
const auto *picon = attributes.value(QFormBuilderStrings::iconAttribute)) {
495 QVariant v = resourceBuilder()->loadResource(workingDirectory(), picon);
496 QVariant nativeValue = resourceBuilder()->toNativeValue(v);
497 toolBox->setItemIcon(tabIndex, qvariant_cast<QIcon>(nativeValue));
500#if QT_CONFIG(tooltip)
501 if (
const auto *ptoolTip = attributes.value(QFormBuilderStrings::toolTipAttribute)) {
502 toolBox->setItemToolTip(tabIndex, toString(ptoolTip->elementString()));
510#if QT_CONFIG(stackedwidget)
511 else if (
auto *stackedWidget = qobject_cast<QStackedWidget*>(parentWidget)) {
512 stackedWidget->addWidget(widget);
517#if QT_CONFIG(splitter)
518 else if (
auto *splitter = qobject_cast<QSplitter*>(parentWidget)) {
519 splitter->addWidget(widget);
524#if QT_CONFIG(mdiarea)
525 else if (
auto *mdiArea = qobject_cast<QMdiArea*>(parentWidget)) {
526 mdiArea->addSubWindow(widget);
531#if QT_CONFIG(dockwidget)
532 else if (
auto *dockWidget = qobject_cast<QDockWidget*>(parentWidget)) {
533 dockWidget->setWidget(widget);
538#if QT_CONFIG(scrollarea)
539 else if (
auto *scrollArea = qobject_cast<QScrollArea*>(parentWidget)) {
540 scrollArea->setWidget(widget);
546 else if (
auto *wizard = qobject_cast<QWizard *>(parentWidget)) {
547 auto *page = qobject_cast<QWizardPage*>(widget);
549 uiLibWarning(QCoreApplication::translate(
"QAbstractFormBuilder",
"Attempt to add child that is not of class QWizardPage to QWizard."));
552 wizard->addPage(page);
560
561
562void QAbstractFormBuilder::layoutInfo(DomLayout *ui_layout, QObject *parent,
int *margin,
int *spacing)
565 auto properties = ui_layout->elementProperty();
569 if (
const DomProperty *p = QFBE::propertyByName(properties,
"margin"))
570 mar = p->elementNumber();
571 if (
const DomProperty *p = QFBE::propertyByName(properties,
"spacing"))
572 spac = p->elementNumber();
576 if (mar != INT_MIN) {
577 const int defaultMargin = parent->inherits(
"QLayoutWidget") ? 0 : 9;
578 if (mar == defaultMargin)
583 if (mar == INT_MIN || spac == INT_MIN) {
584 for (
auto it = properties.begin(); it != properties.end(); ) {
585 DomProperty *prop = *it;
586 if ((mar == INT_MIN && prop->attributeName() ==
"margin"_L1)
587 || (spac == INT_MIN && prop->attributeName() ==
"spacing"_L1)) {
589 it = properties.erase(it);
594 ui_layout->setElementProperty(properties);
605
606
607QLayout *QAbstractFormBuilder::create(DomLayout *ui_layout, QLayout *parentLayout, QWidget *parentWidget)
609 QObject *p = parentLayout;
614 Q_ASSERT(p !=
nullptr);
616 bool tracking =
false;
618 if (p == parentWidget && parentWidget->layout()) {
620 p = parentWidget->layout();
623 QLayout *layout = createLayout(ui_layout->attributeClass(), p, ui_layout->hasAttributeName() ? ui_layout->attributeName() : QString());
625 if (layout ==
nullptr)
628 if (tracking && layout->parent() ==
nullptr) {
629 auto *box = qobject_cast<QBoxLayout*>(parentWidget->layout());
631 const QString widgetClass = QString::fromUtf8(parentWidget->metaObject()->className());
632 const QString layoutClass = QString::fromUtf8(parentWidget->layout()->metaObject()->className());
633 const QString msg = QCoreApplication::translate(
"QAbstractFormBuilder",
"Attempt to add a layout to a widget '%1' (%2) which already has a layout of non-box type %3.\n"
634 "This indicates an inconsistency in the ui-file.").
635 arg(parentWidget->objectName(), widgetClass, layoutClass);
639 box->addLayout(layout);
642 int margin = INT_MIN, spacing = INT_MIN;
643 layoutInfo(ui_layout, p, &margin, &spacing);
645 if (margin != INT_MIN) {
646 layout->setContentsMargins(margin, margin, margin, margin);
648 int left = -1, top = -1, right = -1, bottom = -1;
649 layout->getContentsMargins(&left, &top, &right, &bottom);
650 QFormBuilderExtra::getLayoutMargins(ui_layout->elementProperty(),
651 &left, &top, &right, &bottom);
652 layout->setContentsMargins(left, top, right, bottom);
655 if (spacing != INT_MIN) {
656 layout->setSpacing(spacing);
658 auto *grid = qobject_cast<QGridLayout *>(layout);
660 const auto &properties = ui_layout->elementProperty();
661 if (
const auto *p = QFBE::propertyByName(properties,
"horizontalSpacing"))
662 grid->setHorizontalSpacing(p->elementNumber());
663 if (
const auto *p = QFBE::propertyByName(properties,
"verticalSpacing"))
664 grid->setVerticalSpacing(p->elementNumber());
668 applyProperties(layout, ui_layout->elementProperty());
670 const auto &elementItem = ui_layout->elementItem();
671 for (DomLayoutItem *ui_item : elementItem) {
672 if (QLayoutItem *item = create(ui_item, layout, parentWidget)) {
673 addItem(ui_item, item, layout);
677 if (
auto *box = qobject_cast<QBoxLayout*>(layout)) {
678 const QString boxStretch = ui_layout->attributeStretch();
679 if (!boxStretch.isEmpty())
680 QFormBuilderExtra::setBoxLayoutStretch(boxStretch, box);
683 if (
auto *grid = qobject_cast<QGridLayout*>(layout)) {
685 const QString gridRowStretch = ui_layout->attributeRowStretch();
686 if (!gridRowStretch.isEmpty())
687 QFormBuilderExtra::setGridLayoutRowStretch(gridRowStretch, grid);
688 const QString gridColumnStretch = ui_layout->attributeColumnStretch();
689 if (!gridColumnStretch.isEmpty())
690 QFormBuilderExtra::setGridLayoutColumnStretch(gridColumnStretch, grid);
692 const QString gridColumnMinimumWidth = ui_layout->attributeColumnMinimumWidth();
693 if (!gridColumnMinimumWidth.isEmpty())
694 QFormBuilderExtra::setGridLayoutColumnMinimumWidth(gridColumnMinimumWidth, grid);
695 const QString gridRowMinimumHeight = ui_layout->attributeRowMinimumHeight();
696 if (!gridRowMinimumHeight.isEmpty())
697 QFormBuilderExtra::setGridLayoutRowMinimumHeight(gridRowMinimumHeight, grid);
702#if QT_CONFIG(formlayout)
703static inline QFormLayout::ItemRole formLayoutRole(
int column,
int colspan)
706 return QFormLayout::SpanningRole;
707 return column == 0 ? QFormLayout::LabelRole : QFormLayout::FieldRole;
713 return fullyQualifiedEnums ?
"Qt::AlignmentFlag::"_L1 :
"Qt::"_L1;
720 switch (a & Qt::AlignHorizontal_Mask) {
727 case Qt::AlignHCenter:
728 h =
"AlignHCenter"_L1;
730 case Qt::AlignJustify:
731 h =
"AlignJustify"_L1;
734 switch (a & Qt::AlignVertical_Mask) {
738 case Qt::AlignBottom:
739 v =
"AlignBottom"_L1;
741 case Qt::AlignVCenter:
742 v =
"AlignVCenter"_L1;
747 result += alignmentPrefix(fullyQualifiedEnums) + h;
748 if (!h.isEmpty() && !v.isEmpty())
751 result += alignmentPrefix(fullyQualifiedEnums) + v;
759 for (
const auto &f : qTokenize(in, u'|')) {
760 if (f.endsWith(
"::AlignLeft"_L1)) {
762 }
else if (f.endsWith(
"::AlignRight"_L1)) {
763 rc |= Qt::AlignRight;
764 }
else if (f.endsWith(
"::AlignHCenter"_L1)) {
765 rc |= Qt::AlignHCenter;
766 }
else if (f.endsWith(
"::AlignJustify"_L1)) {
767 rc |= Qt::AlignJustify;
768 }
else if (f.endsWith(
"::AlignTop"_L1)) {
770 }
else if (f.endsWith(
"::AlignBottom"_L1)) {
771 rc |= Qt::AlignBottom;
772 }
else if (f.endsWith(
"::AlignVCenter"_L1)) {
773 rc |= Qt::AlignVCenter;
781
782
783bool QAbstractFormBuilder::addItem(DomLayoutItem *ui_item, QLayoutItem *item, QLayout *layout)
787 if (item->widget()) {
788 static_cast<QFriendlyLayout*>(layout)->addChildWidget(item->widget());
789 }
else if (item->layout()) {
790 static_cast<QFriendlyLayout*>(layout)->addChildLayout(item->layout());
791 }
else if (item->spacerItem()) {
797 if (
auto *grid = qobject_cast<QGridLayout*>(layout)) {
798 const int rowSpan = ui_item->hasAttributeRowSpan() ? ui_item->attributeRowSpan() : 1;
799 const int colSpan = ui_item->hasAttributeColSpan() ? ui_item->attributeColSpan() : 1;
800 grid->addItem(item, ui_item->attributeRow(), ui_item->attributeColumn(),
801 rowSpan, colSpan, item->alignment());
804#if QT_CONFIG(formlayout)
805 if (
auto *form = qobject_cast<QFormLayout *>(layout)) {
806 const int row = ui_item->attributeRow();
807 const int colSpan = ui_item->hasAttributeColSpan() ? ui_item->attributeColSpan() : 1;
808 form->setItem(row, formLayoutRole(ui_item->attributeColumn(), colSpan), item);
813 layout->addItem(item);
818
819
820QLayoutItem *QAbstractFormBuilder::create(DomLayoutItem *ui_layoutItem, QLayout *layout, QWidget *parentWidget)
822 switch (ui_layoutItem->kind()) {
823 case DomLayoutItem::Widget: {
824 if (QWidget *w = create(ui_layoutItem->elementWidget(), parentWidget)) {
825#ifdef QFORMINTERNAL_NAMESPACE
826 QWidgetItem *item =
new QWidgetItemV2(w);
828 QWidgetItem *item = QLayoutPrivate::createWidgetItem(layout, w);
830 item->setAlignment(alignmentFromDom(ui_layoutItem->attributeAlignment()));
833 qWarning() << QCoreApplication::translate(
"QAbstractFormBuilder",
"Empty widget item in %1 '%2'.").arg(QString::fromUtf8(layout->metaObject()->className()), layout->objectName());
836 case DomLayoutItem::Spacer: {
838 QSizePolicy::Policy sizeType = QSizePolicy::Expanding;
839 bool isVspacer =
false;
841 const DomSpacer *ui_spacer = ui_layoutItem->elementSpacer();
842 const auto &spacerProperties = ui_spacer->elementProperty();
843 if (!spacerProperties.isEmpty()) {
844 for (DomProperty *p : spacerProperties) {
845 const QVariant v = toVariant(&QAbstractFormBuilderGadget::staticMetaObject, p);
848 if (p->attributeName() ==
"sizeHint"_L1 && p->kind() == DomProperty::Size) {
850 }
else if (p->attributeName() ==
"sizeType"_L1 && p->kind() == DomProperty::Enum) {
851 sizeType =
static_cast<QSizePolicy::Policy>(v.toInt());
852 }
else if (p->attributeName() ==
"orientation"_L1 && p->kind() == DomProperty::Enum) {
853 const auto o =
static_cast<Qt::Orientation>(v.toInt());
854 isVspacer = (o == Qt::Vertical);
859 QSpacerItem *spacer =
nullptr;
861 spacer =
new QSpacerItem(size.width(), size.height(), QSizePolicy::Minimum, sizeType);
863 spacer =
new QSpacerItem(size.width(), size.height(), sizeType, QSizePolicy::Minimum);
866 case DomLayoutItem::Layout:
867 return create(ui_layoutItem->elementLayout(), layout, parentWidget);
877
878
879void QAbstractFormBuilder::applyProperties(QObject *o,
const QList<DomProperty*> &properties)
881 for (DomProperty *p : properties) {
882 const QVariant v = toVariant(o->metaObject(), p);
884 QString attributeName = p->attributeName();
885 if (attributeName ==
"numDigits"_L1 && o->inherits(
"QLCDNumber"))
886 attributeName = u"digitCount"_s;
887 if (!d->applyPropertyInternally(o, attributeName, v))
888 o->setProperty(attributeName.toUtf8().constData(), v);
895
896
897
898
900bool QAbstractFormBuilder::applyPropertyInternally(QObject *o,
const QString &propertyName,
const QVariant &value)
902 return d->applyPropertyInternally(o,propertyName, value);
906
907
909QVariant QAbstractFormBuilder::toVariant(
const QMetaObject *meta, DomProperty *p)
911 return domPropertyToVariant(
this, meta, p);
1071DomWidget *QAbstractFormBuilder::createDom(QWidget *widget, DomWidget *ui_parentWidget,
bool recursive)
1073 auto *ui_widget =
new DomWidget();
1074 ui_widget->setAttributeClass(QLatin1StringView(widget->metaObject()->className()));
1075 ui_widget->setAttributeName(widget->objectName());
1077 ui_widget->setElementProperty(computeProperties(widget));
1080 if (QLayout *layout = widget->layout()) {
1081 if (DomLayout *ui_layout = createDom(layout,
nullptr, ui_parentWidget)) {
1082 QList<DomLayout *> ui_layouts;
1083 ui_layouts.append(ui_layout);
1085 ui_widget->setElementLayout(ui_layouts);
1091 QList<DomWidget *> ui_widgets;
1092 QList<DomAction *> ui_actions;
1093 QList<DomActionGroup *> ui_action_groups;
1095 QObjectList children;
1099#if QT_CONFIG(splitter)
1100 if (
const auto *splitter = qobject_cast<
const QSplitter*>(widget)) {
1101 const int count = splitter->count();
1102 for (
int i = 0; i < count; ++i)
1103 children.append(splitter->widget(i));
1107 QObjectList childObjects = widget->children();
1109 const auto list = qvariant_cast<QWidgetList>(widget->property(
"_q_widgetOrder"));
1110 for (QWidget *w : list) {
1111 if (childObjects.contains(w)) {
1113 childObjects.removeAll(w);
1116 children += childObjects;
1118 const auto zOrder = qvariant_cast<QWidgetList>(widget->property(
"_q_zOrder"));
1119 if (list != zOrder) {
1120 QStringList zOrderList;
1121 zOrderList.reserve(zOrder.size());
1122 std::transform(zOrder.cbegin(), zOrder.cend(),
1123 std::back_inserter(zOrderList),
1124 [] (
const QWidget *w) {
return w->objectName(); });
1125 ui_widget->setElementZOrder(zOrderList);
1129 for (QObject *obj : std::as_const(children)) {
1130 if (
auto *childWidget = qobject_cast<QWidget*>(obj)) {
1131 if (d->m_laidout.contains(childWidget) || !recursive)
1134 if (
auto *menu = qobject_cast<QMenu *>(childWidget)) {
1135 const auto actions = menu->parentWidget()->actions();
1137 std::any_of(actions.cbegin(), actions.cend(),
1138 [menu] (
const QAction *a) {
return a->menu() == menu; });
1143 if (DomWidget *ui_child = createDom(childWidget, ui_widget)) {
1144 ui_widgets.append(ui_child);
1146 }
else if (
auto *childAction = qobject_cast<QAction*>(obj)) {
1147 if (childAction->actionGroup() !=
nullptr) {
1152 if (DomAction *ui_action = createDom(childAction)) {
1153 ui_actions.append(ui_action);
1155 }
else if (
auto *childActionGroup = qobject_cast<QActionGroup*>(obj)) {
1156 if (DomActionGroup *ui_action_group = createDom(childActionGroup)) {
1157 ui_action_groups.append(ui_action_group);
1163 QList<DomActionRef *> ui_action_refs;
1164 const auto &actions = widget->actions();
1165 ui_action_refs.reserve(actions.size());
1166 for (QAction *action : actions) {
1167 if (DomActionRef *ui_action_ref = createActionRefDom(action)) {
1168 ui_action_refs.append(ui_action_ref);
1173 ui_widget->setElementWidget(ui_widgets);
1175 ui_widget->setElementAction(ui_actions);
1176 ui_widget->setElementActionGroup(ui_action_groups);
1177 ui_widget->setElementAddAction(ui_action_refs);
1179 saveExtraInfo(widget, ui_widget, ui_parentWidget);
1294DomLayout *QAbstractFormBuilder::createDom(QLayout *layout, DomLayout *ui_layout, DomWidget *ui_parentWidget)
1296 Q_UNUSED(ui_layout);
1297 auto *lay =
new DomLayout();
1298 lay->setAttributeClass(QLatin1StringView(layout->metaObject()->className()));
1299 const QString objectName = layout->objectName();
1300 if (!objectName.isEmpty())
1301 lay->setAttributeName(objectName);
1302 lay->setElementProperty(computeProperties(layout));
1304 QList<FormBuilderSaveLayoutEntry> newList;
1305 if (
auto *gridLayout = qobject_cast<QGridLayout *>(layout)) {
1306 newList = saveGridLayoutEntries(gridLayout);
1307#if QT_CONFIG(formlayout)
1308 }
else if (
const auto *formLayout = qobject_cast<
const QFormLayout *>(layout)) {
1309 newList = saveFormLayoutEntries(formLayout);
1312 newList = saveLayoutEntries(layout);
1315 QList<DomLayoutItem *> ui_items;
1316 ui_items.reserve(newList.size());
1317 for (
const FormBuilderSaveLayoutEntry &item : std::as_const(newList)) {
1318 if (DomLayoutItem *ui_item = createDom(item.item, lay, ui_parentWidget)) {
1320 ui_item->setAttributeRow(item.row);
1321 if (item.column >= 0)
1322 ui_item->setAttributeColumn(item.column);
1323 if (item.rowSpan > 1)
1324 ui_item->setAttributeRowSpan(item.rowSpan);
1325 if (item.columnSpan > 1)
1326 ui_item->setAttributeColSpan(item.columnSpan);
1328 ui_item->setAttributeAlignment(alignmentValue(item.alignment,
1329 d->m_fullyQualifiedEnums));
1330 ui_items.append(ui_item);
1334 lay->setElementItem(ui_items);
1572 QList<DomProperty*> *properties,
1575 static const QFormBuilderStrings &strings = QFormBuilderStrings::instance();
1576 auto *
const formBuilder =
static_cast<FriendlyFB *>(abstractFormBuilder);
1578 for (
const QFormBuilderStrings::TextRoleNName &it : strings.itemTextRoles) {
1579 if (DomProperty *p = formBuilder->saveText(it.second, item->data(it.first.second)))
1580 properties->append(p);
1583 const auto *mo = &QAbstractFormBuilderGadget::staticMetaObject;
1584 for (
const QFormBuilderStrings::RoleNName &it : strings.itemRoles) {
1585 const QVariant v = item->data(it.first);
1586 const bool isModified = v.isValid()
1587 && (it.first != Qt::TextAlignmentRole || v.toUInt() != uint(defaultAlign));
1589 if (DomProperty *p = variantToDomProperty(abstractFormBuilder, mo, it.second, v))
1590 properties->append(p);
1594 if (DomProperty *p = formBuilder->saveResource(item->data(Qt::DecorationPropertyRole)))
1595 properties->append(p);
1608 const QHash<QString, DomProperty*> &properties)
1610 static const QFormBuilderStrings &strings = QFormBuilderStrings::instance();
1611 auto *
const formBuilder =
static_cast<FriendlyFB *>(abstractFormBuilder);
1613 for (
const QFormBuilderStrings::TextRoleNName &it : strings.itemTextRoles)
1614 if (DomProperty *p = properties.value(it.second)) {
1615 const QVariant v = formBuilder->textBuilder()->loadText(p);
1616 QVariant nativeValue = formBuilder->textBuilder()->toNativeValue(v);
1617 item->setData(it.first.first, qvariant_cast<QString>(nativeValue));
1618 item->setData(it.first.second, v);
1621 for (
const QFormBuilderStrings::RoleNName &it : strings.itemRoles) {
1622 if (DomProperty *p = properties.value(it.second)) {
1623 if (
const QVariant v = formBuilder->toVariant(&QAbstractFormBuilderGadget::staticMetaObject, p); v.isValid())
1624 item->setData(it.first, v);
1628 if (DomProperty *p = properties.value(strings.iconAttribute)) {
1629 const QVariant v = formBuilder->resourceBuilder()->loadResource(formBuilder->workingDirectory(), p);
1630 QVariant nativeValue = formBuilder->resourceBuilder()->toNativeValue(v);
1631 item->setIcon(qvariant_cast<QIcon>(nativeValue));
1632 item->setData(Qt::DecorationPropertyRole, v);
1654void QAbstractFormBuilder::saveTreeWidgetExtraInfo(QTreeWidget *treeWidget, DomWidget *ui_widget, DomWidget *ui_parentWidget)
1656 Q_UNUSED(ui_parentWidget);
1658 QList<DomColumn *> columns;
1660 const QFormBuilderStrings &strings = QFormBuilderStrings::instance();
1662 for (
int c = 0; c<treeWidget->columnCount(); ++c) {
1663 auto *column =
new DomColumn;
1665 QList<DomProperty*> properties;
1667 for (
const QFormBuilderStrings::TextRoleNName &it : strings.itemTextRoles) {
1668 DomProperty *p = saveText(it.second, treeWidget->headerItem()->data(c, it.first.second));
1670 if (!p && it.first.first == Qt::EditRole && it.second ==
"text"_L1) {
1671 auto *defaultHeader =
new DomString;
1672 defaultHeader->setText(QString::number(c + 1));
1673 defaultHeader->setAttributeNotr(u"true"_s);
1674 p =
new DomProperty;
1675 p->setAttributeName(it.second);
1676 p->setElementString(defaultHeader);
1679 properties.append(p);
1682 for (
const QFormBuilderStrings::RoleNName &it : strings.itemRoles) {
1683 if (
const QVariant v = treeWidget->headerItem()->data(c, it.first); v.isValid()) {
1684 if (DomProperty *p = variantToDomProperty(
this, &QAbstractFormBuilderGadget::staticMetaObject, it.second, v))
1685 properties.append(p);
1689 if (DomProperty *p = saveResource(treeWidget->headerItem()->data(c, Qt::DecorationPropertyRole)))
1690 properties.append(p);
1692 column->setElementProperty(properties);
1693 columns.append(column);
1696 ui_widget->setElementColumn(columns);
1698 auto items = ui_widget->elementItem();
1700 QQueue<std::pair<QTreeWidgetItem *, DomItem *> > pendingQueue;
1701 for (
int i = 0; i < treeWidget->topLevelItemCount(); i++)
1702 pendingQueue.enqueue(std::make_pair(treeWidget->topLevelItem(i),
nullptr));
1704 while (!pendingQueue.isEmpty()) {
1705 const std::pair<QTreeWidgetItem *, DomItem *> pair = pendingQueue.dequeue();
1706 QTreeWidgetItem *item = pair.first;
1707 DomItem *parentDomItem = pair.second;
1709 auto *currentDomItem =
new DomItem;
1711 QList<DomProperty*> properties;
1712 for (
int c = 0; c < treeWidget->columnCount(); c++) {
1713 for (
const QFormBuilderStrings::TextRoleNName &it : strings.itemTextRoles) {
1714 if (DomProperty *p = saveText(it.second, item->data(c, it.first.second)))
1715 properties.append(p);
1718 for (
const QFormBuilderStrings::RoleNName &it : strings.itemRoles) {
1719 if (
const QVariant v = item->data(c, it.first); v.isValid()) {
1720 if (DomProperty *p = variantToDomProperty(
this, &QAbstractFormBuilderGadget::staticMetaObject, it.second, v))
1721 properties.append(p);
1725 if (DomProperty *p = saveResource(item->data(c, Qt::DecorationPropertyRole)))
1726 properties.append(p);
1728 storeItemFlags(item, &properties);
1729 currentDomItem->setElementProperty(properties);
1731 if (parentDomItem) {
1732 auto childrenItems = parentDomItem->elementItem();
1733 childrenItems.append(currentDomItem);
1734 parentDomItem->setElementItem(childrenItems);
1736 items.append(currentDomItem);
1738 for (
int i = 0; i < item->childCount(); i++)
1739 pendingQueue.enqueue(std::make_pair(item->child(i), currentDomItem));
1742 ui_widget->setElementItem(items);
1748void QAbstractFormBuilder::saveTableWidgetExtraInfo(QTableWidget *tableWidget, DomWidget *ui_widget, DomWidget *ui_parentWidget)
1750 Q_UNUSED(ui_parentWidget);
1753 QList<DomColumn *> columns;
1754 auto *header = tableWidget->horizontalHeader();
1755 for (
int c = 0; c < tableWidget->columnCount(); c++) {
1756 QList<DomProperty*> properties;
1757 QTableWidgetItem *item = tableWidget->horizontalHeaderItem(c);
1759 storeItemProps(
this, item, &properties, header->defaultAlignment());
1761 auto *column =
new DomColumn;
1762 column->setElementProperty(properties);
1763 columns.append(column);
1765 ui_widget->setElementColumn(columns);
1768 QList<DomRow *> rows;
1769 header = tableWidget->verticalHeader();
1770 for (
int r = 0; r < tableWidget->rowCount(); r++) {
1771 QList<DomProperty*> properties;
1772 QTableWidgetItem *item = tableWidget->verticalHeaderItem(r);
1774 storeItemProps(
this, item, &properties, header->defaultAlignment());
1776 auto *row =
new DomRow;
1777 row->setElementProperty(properties);
1780 ui_widget->setElementRow(rows);
1782 auto items = ui_widget->elementItem();
1783 for (
int r = 0; r < tableWidget->rowCount(); r++)
1784 for (
int c = 0; c < tableWidget->columnCount(); c++) {
1785 QTableWidgetItem *item = tableWidget->item(r, c);
1787 QList<DomProperty*> properties;
1788 storeItemPropsNFlags(
this, item, &properties);
1790 auto *domItem =
new DomItem;
1791 domItem->setAttributeRow(r);
1792 domItem->setAttributeColumn(c);
1793 domItem->setElementProperty(properties);
1794 items.append(domItem);
1798 ui_widget->setElementItem(items);
1824void QAbstractFormBuilder::saveComboBoxExtraInfo(QComboBox *comboBox, DomWidget *ui_widget, DomWidget *ui_parentWidget)
1826 Q_UNUSED(ui_parentWidget);
1827 auto ui_items = ui_widget->elementItem();
1829 const int count = comboBox->count();
1830 for (
int i=0; i < count; ++i) {
1833 DomProperty *textProperty = saveText(QFormBuilderStrings::textAttribute,
1834 comboBox->itemData(i, Qt::DisplayPropertyRole));
1835 DomProperty *iconProperty = saveResource(comboBox->itemData(i, Qt::DecorationPropertyRole));
1836 if (textProperty || iconProperty) {
1837 QList<DomProperty*> properties;
1839 properties.push_back(textProperty);
1841 properties.push_back(iconProperty);
1843 auto *ui_item =
new DomItem();
1844 ui_item->setElementProperty(properties);
1845 ui_items.push_back(ui_item);
1849 ui_widget->setElementItem(ui_items);
1894void QAbstractFormBuilder::saveItemViewExtraInfo(
const QAbstractItemView *itemView,
1895 DomWidget *ui_widget, DomWidget *)
1897 if (
const auto *treeView = qobject_cast<
const QTreeView*>(itemView)) {
1898 auto viewProperties = ui_widget->elementAttribute();
1899 const auto &headerProperties = computeProperties(treeView->header());
1900 for (
const QLatin1StringView realPropertyName : itemViewHeaderRealPropertyNames) {
1901 const QString upperPropertyName = QChar(realPropertyName.at(0)).toUpper()
1902 + realPropertyName.mid(1);
1903 const QString fakePropertyName =
"header"_L1 + upperPropertyName;
1904 for (DomProperty *property : headerProperties) {
1905 if (property->attributeName() == realPropertyName) {
1906 property->setAttributeName(fakePropertyName);
1907 viewProperties << property;
1911 ui_widget->setElementAttribute(viewProperties);
1912 }
else if (
const auto *tableView = qobject_cast<
const QTableView*>(itemView)) {
1913 auto viewProperties = ui_widget->elementAttribute();
1914 for (QLatin1StringView headerPrefix : tableHeaderPrefixes) {
1915 const auto &headerProperties = headerPrefix ==
"horizontalHeader"_L1
1916 ? computeProperties(tableView->horizontalHeader())
1917 : computeProperties(tableView->verticalHeader());
1918 for (
const QLatin1StringView realPropertyName : itemViewHeaderRealPropertyNames) {
1919 const QString upperPropertyName = QChar(realPropertyName.at(0)).toUpper()
1920 + realPropertyName.mid(1);
1921 const QString fakePropertyName = headerPrefix + upperPropertyName;
1922 for (DomProperty *property : std::as_const(headerProperties)) {
1923 if (property->attributeName() == realPropertyName) {
1924 property->setAttributeName(fakePropertyName);
1925 viewProperties << property;
1930 ui_widget->setElementAttribute(viewProperties);
1977void QAbstractFormBuilder::saveExtraInfo(QWidget *widget, DomWidget *ui_widget,
1978 DomWidget *ui_parentWidget)
1981#if QT_CONFIG(listwidget)
1982 }
else if (
auto *listWidget = qobject_cast<QListWidget*>(widget)) {
1983 saveListWidgetExtraInfo(listWidget, ui_widget, ui_parentWidget);
1985#if QT_CONFIG(treewidget)
1986 }
else if (
auto *treeWidget = qobject_cast<QTreeWidget*>(widget)) {
1987 saveTreeWidgetExtraInfo(treeWidget, ui_widget, ui_parentWidget);
1989#if QT_CONFIG(tablewidget)
1990 }
else if (
auto *tableWidget = qobject_cast<QTableWidget*>(widget)) {
1991 saveTableWidgetExtraInfo(tableWidget, ui_widget, ui_parentWidget);
1993#if QT_CONFIG(combobox)
1994 }
else if (
auto *comboBox = qobject_cast<QComboBox*>(widget)) {
1995 if (!QFormBuilderExtra::isQFontComboBox(widget))
1996 saveComboBoxExtraInfo(comboBox, ui_widget, ui_parentWidget);
1998 }
else if (
auto *ab = qobject_cast<QAbstractButton *>(widget)) {
1999 saveButtonExtraInfo(ab, ui_widget, ui_parentWidget);
2001 if (
auto *itemView = qobject_cast<QAbstractItemView *>(widget)) {
2002 saveItemViewExtraInfo(itemView, ui_widget, ui_parentWidget);
2026void QAbstractFormBuilder::loadTreeWidgetExtraInfo(DomWidget *ui_widget, QTreeWidget *treeWidget, QWidget *parentWidget)
2028 Q_UNUSED(parentWidget);
2029 const QFormBuilderStrings &strings = QFormBuilderStrings::instance();
2030 const QMetaEnum itemFlags_enum = metaEnum<QAbstractFormBuilderGadget>(
"itemFlags");
2031 const auto &columns = ui_widget->elementColumn();
2032 if (!columns.isEmpty())
2033 treeWidget->setColumnCount(columns.size());
2035 for (qsizetype i = 0, size = columns.size(); i < size; ++i) {
2036 const DomColumn *c = columns.at(i);
2037 const DomPropertyHash properties = propertyMap(c->elementProperty());
2039 for (
const QFormBuilderStrings::RoleNName &it : strings.itemRoles) {
2040 if (DomProperty *p = properties.value(it.second)) {
2041 if (
const QVariant v = toVariant(&QAbstractFormBuilderGadget::staticMetaObject, p); v.isValid())
2042 treeWidget->headerItem()->setData(i, it.first, v);
2046 for (
const QFormBuilderStrings::TextRoleNName &it : strings.itemTextRoles) {
2047 if (DomProperty *p = properties.value(it.second)) {
2048 const QVariant v = textBuilder()->loadText(p);
2049 QVariant nativeValue = textBuilder()->toNativeValue(v);
2050 treeWidget->headerItem()->setData(i, it.first.first, qvariant_cast<QString>(nativeValue));
2051 treeWidget->headerItem()->setData(i, it.first.second, v);
2055 if (DomProperty *p = properties.value(QFormBuilderStrings::iconAttribute)) {
2056 const QVariant v = resourceBuilder()->loadResource(workingDirectory(), p);
2057 QVariant nativeValue = resourceBuilder()->toNativeValue(v);
2058 treeWidget->headerItem()->setIcon(i, qvariant_cast<QIcon>(nativeValue));
2059 treeWidget->headerItem()->setData(i, Qt::DecorationPropertyRole, v);
2063 QQueue<std::pair<DomItem *, QTreeWidgetItem *> > pendingQueue;
2064 const auto &widgetElementItem = ui_widget->elementItem();
2065 for (DomItem *ui_item : widgetElementItem)
2066 pendingQueue.enqueue(std::make_pair(ui_item,
nullptr));
2068 while (!pendingQueue.isEmpty()) {
2069 const std::pair<DomItem *, QTreeWidgetItem *> pair = pendingQueue.dequeue();
2070 const DomItem *domItem = pair.first;
2071 QTreeWidgetItem *parentItem = pair.second;
2073 QTreeWidgetItem *currentItem =
nullptr;
2076 currentItem =
new QTreeWidgetItem(parentItem);
2078 currentItem =
new QTreeWidgetItem(treeWidget);
2080 const auto &properties = domItem->elementProperty();
2082 for (DomProperty *property : properties) {
2083 if (property->attributeName() == QFormBuilderStrings::flagsAttribute
2084 && !property->elementSet().isEmpty()) {
2085 currentItem->setFlags(enumKeysToValue<Qt::ItemFlags>(
2086 itemFlags_enum, property->elementSet().toLatin1().constData()));
2087 }
else if (property->attributeName() == QFormBuilderStrings::textAttribute
2088 && property->elementString()) {
2090 QVariant textV = textBuilder()->loadText(property);
2091 QVariant nativeValue = textBuilder()->toNativeValue(textV);
2092 currentItem->setText(col, qvariant_cast<QString>(nativeValue));
2093 currentItem->setData(col, Qt::DisplayPropertyRole, textV);
2094 }
else if (col >= 0) {
2095 if (property->attributeName() == QFormBuilderStrings::iconAttribute) {
2096 QVariant v = resourceBuilder()->loadResource(workingDirectory(), property);
2098 QVariant nativeValue = resourceBuilder()->toNativeValue(v);
2099 currentItem->setIcon(col, qvariant_cast<QIcon>(nativeValue));
2100 currentItem->setData(col, Qt::DecorationPropertyRole, v);
2103 int role = strings.treeItemRoleHash.value(property->attributeName(), (Qt::ItemDataRole)-1);
2105 if (
const QVariant v = toVariant(&QAbstractFormBuilderGadget::staticMetaObject, property); v.isValid())
2106 currentItem->setData(col, role, v);
2108 std::pair<Qt::ItemDataRole, Qt::ItemDataRole> rolePair =
2109 strings.treeItemTextRoleHash.value(property->attributeName(),
2110 std::make_pair((Qt::ItemDataRole)-1, (Qt::ItemDataRole)-1));
2111 if (rolePair.first >= 0) {
2112 QVariant textV = textBuilder()->loadText(property);
2113 QVariant nativeValue = textBuilder()->toNativeValue(textV);
2114 currentItem->setData(col, rolePair.first, qvariant_cast<QString>(nativeValue));
2115 currentItem->setData(col, rolePair.second, textV);
2122 const auto &elementItem = domItem->elementItem();
2123 for (DomItem *childItem : elementItem)
2124 pendingQueue.enqueue(std::make_pair(childItem, currentItem));
2132void QAbstractFormBuilder::loadTableWidgetExtraInfo(DomWidget *ui_widget, QTableWidget *tableWidget, QWidget *parentWidget)
2134 Q_UNUSED(parentWidget);
2136 const auto &columns = ui_widget->elementColumn();
2137 if (!columns.isEmpty())
2138 tableWidget->setColumnCount(columns.size());
2139 for (qsizetype i = 0, size = columns.size(); i < size; ++i) {
2140 DomColumn *c = columns.at(i);
2141 const DomPropertyHash properties = propertyMap(c->elementProperty());
2143 if (!properties.isEmpty()) {
2144 auto *item =
new QTableWidgetItem;
2145 loadItemProps(
this, item, properties);
2146 tableWidget->setHorizontalHeaderItem(i, item);
2150 const auto &rows = ui_widget->elementRow();
2151 if (!rows.isEmpty())
2152 tableWidget->setRowCount(rows.size());
2153 for (qsizetype i = 0, size = rows.size(); i < size; ++i) {
2154 const DomRow *r = rows.at(i);
2155 const DomPropertyHash properties = propertyMap(r->elementProperty());
2157 if (!properties.isEmpty()) {
2158 auto *item =
new QTableWidgetItem;
2159 loadItemProps(
this, item, properties);
2160 tableWidget->setVerticalHeaderItem(i, item);
2164 const auto &elementItem = ui_widget->elementItem();
2165 for (DomItem *ui_item : elementItem) {
2166 if (ui_item->hasAttributeRow() && ui_item->hasAttributeColumn()) {
2167 const DomPropertyHash properties = propertyMap(ui_item->elementProperty());
2168 auto *item =
new QTableWidgetItem;
2169 loadItemPropsNFlags(
this, item, properties);
2170 tableWidget->setItem(ui_item->attributeRow(), ui_item->attributeColumn(), item);
2178void QAbstractFormBuilder::loadComboBoxExtraInfo(DomWidget *ui_widget, QComboBox *comboBox, QWidget *parentWidget)
2180 Q_UNUSED(parentWidget);
2181 const auto &elementItem = ui_widget->elementItem();
2182 for (DomItem *ui_item : elementItem) {
2183 const auto &properties = ui_item->elementProperty();
2189 DomProperty *p = QFBE::propertyByName(properties, QFormBuilderStrings::textAttribute);
2190 if (p && p->elementString()) {
2191 textData = textBuilder()->loadText(p);
2192 text = qvariant_cast<QString>(textBuilder()->toNativeValue(textData));
2195 p = QFBE::propertyByName(properties, QFormBuilderStrings::iconAttribute);
2197 iconData = resourceBuilder()->loadResource(workingDirectory(), p);
2198 icon = qvariant_cast<QIcon>(resourceBuilder()->toNativeValue(iconData));
2201 comboBox->addItem(icon, text);
2202 comboBox->setItemData((comboBox->count()-1), iconData, Qt::DecorationPropertyRole);
2203 comboBox->setItemData((comboBox->count()-1), textData, Qt::DisplayPropertyRole);
2206 if (
auto *currentIndex = currentIndexProperty(ui_widget->elementProperty()))
2207 comboBox->setCurrentIndex(currentIndex->elementNumber());
2229void QAbstractFormBuilder::loadButtonExtraInfo(
const DomWidget *ui_widget, QAbstractButton *button, QWidget *)
2231 using ButtonGroupHash = QFormBuilderExtra::ButtonGroupHash;
2233 const QString groupName = buttonGroupName(ui_widget);
2234 if (groupName.isEmpty())
2237 ButtonGroupHash &buttonGroups = d->buttonGroups();
2238 const auto it = buttonGroups.find(groupName);
2239 if (it == buttonGroups.end()) {
2240#ifdef QFORMINTERNAL_NAMESPACE
2241 uiLibWarning(QCoreApplication::translate(
"QAbstractFormBuilder",
"Invalid QButtonGroup reference '%1' referenced by '%2'.").arg(groupName, button->objectName()));
2246 QButtonGroup *&group = it.value().second;
2247 if (group ==
nullptr) {
2248 group =
new QButtonGroup;
2249 group->setObjectName(groupName);
2250 applyProperties(group, it.value().first->elementProperty());
2252 group->addButton(button);
2259void QAbstractFormBuilder::loadItemViewExtraInfo(DomWidget *ui_widget, QAbstractItemView *itemView,
2262 if (
auto *treeView = qobject_cast<QTreeView*>(itemView)) {
2263 const auto &allAttributes = ui_widget->elementAttribute();
2264 QList<DomProperty *> headerProperties;
2265 for (QLatin1StringView realPropertyName : itemViewHeaderRealPropertyNames) {
2266 const QString upperPropertyName = QChar(realPropertyName.at(0)).toUpper()
2267 + realPropertyName.mid(1);
2268 const QString fakePropertyName =
"header"_L1 + upperPropertyName;
2269 for (DomProperty *attr : allAttributes) {
2270 if (attr->attributeName() == fakePropertyName) {
2271 attr->setAttributeName(realPropertyName);
2272 headerProperties << attr;
2276 applyProperties(treeView->header(), headerProperties);
2277 }
else if (
auto *tableView = qobject_cast<QTableView*>(itemView)) {
2278 const auto &allAttributes = ui_widget->elementAttribute();
2279 for (QLatin1StringView headerPrefix : tableHeaderPrefixes) {
2280 QList<DomProperty*> headerProperties;
2281 for (QLatin1StringView realPropertyName : itemViewHeaderRealPropertyNames) {
2282 const QString upperPropertyName = QChar(realPropertyName.at(0)).toUpper()
2283 + realPropertyName.mid(1);
2284 const QString fakePropertyName = headerPrefix + upperPropertyName;
2285 for (DomProperty *attr : allAttributes) {
2286 if (attr->attributeName() == fakePropertyName) {
2287 attr->setAttributeName(realPropertyName);
2288 headerProperties << attr;
2292 if (headerPrefix ==
"horizontalHeader"_L1)
2293 applyProperties(tableView->horizontalHeader(), headerProperties);
2295 applyProperties(tableView->verticalHeader(), headerProperties);
2303void QAbstractFormBuilder::loadExtraInfo(DomWidget *ui_widget, QWidget *widget, QWidget *parentWidget)
2306#if QT_CONFIG(listwidget)
2307 }
else if (
auto *listWidget = qobject_cast<QListWidget*>(widget)) {
2308 loadListWidgetExtraInfo(ui_widget, listWidget, parentWidget);
2310#if QT_CONFIG(treewidget)
2311 }
else if (
auto *treeWidget = qobject_cast<QTreeWidget*>(widget)) {
2312 loadTreeWidgetExtraInfo(ui_widget, treeWidget, parentWidget);
2314#if QT_CONFIG(tablewidget)
2315 }
else if (
auto *tableWidget = qobject_cast<QTableWidget*>(widget)) {
2316 loadTableWidgetExtraInfo(ui_widget, tableWidget, parentWidget);
2318#if QT_CONFIG(combobox)
2319 }
else if (
auto *comboBox = qobject_cast<QComboBox*>(widget)) {
2320 if (!QFormBuilderExtra::isQFontComboBox(widget))
2321 loadComboBoxExtraInfo(ui_widget, comboBox, parentWidget);
2323#if QT_CONFIG(tabwidget)
2324 }
else if (
auto *tabWidget = qobject_cast<QTabWidget*>(widget)) {
2325 if (
auto *currentIndex = currentIndexProperty(ui_widget->elementProperty()))
2326 tabWidget->setCurrentIndex(currentIndex->elementNumber());
2328#if QT_CONFIG(stackedwidget)
2329 }
else if (
auto *stackedWidget = qobject_cast<QStackedWidget*>(widget)) {
2330 if (
auto *currentIndex = currentIndexProperty(ui_widget->elementProperty()))
2331 stackedWidget->setCurrentIndex(currentIndex->elementNumber());
2333#if QT_CONFIG(toolbox)
2334 }
else if (
auto *toolBox = qobject_cast<QToolBox*>(widget)) {
2335 if (
auto *currentIndex = currentIndexProperty(ui_widget->elementProperty()))
2336 toolBox->setCurrentIndex(currentIndex->elementNumber());
2337 if (
auto *tabSpacing = QFBE::propertyByName(ui_widget->elementProperty(),
"tabSpacing"))
2338 toolBox->layout()->setSpacing(tabSpacing->elementNumber());
2340 }
else if (
auto *ab = qobject_cast<QAbstractButton *>(widget)) {
2341 loadButtonExtraInfo(ui_widget, ab, parentWidget);
2343 if (
auto *itemView = qobject_cast<QAbstractItemView *>(widget)) {
2344 loadItemViewExtraInfo(ui_widget, itemView, parentWidget);