85QWidget *QFormBuilder::create(DomWidget *ui_widget, QWidget *parentWidget)
87 if (!d->parentWidgetIsSet())
88 d->setParentWidget(parentWidget);
91 d->setProcessingLayoutWidget(
false);
92 if (ui_widget->attributeClass() ==
"QWidget"_L1 && !ui_widget->hasAttributeNative()
94#if QT_CONFIG(mainwindow)
95 && !qobject_cast<QMainWindow *>(parentWidget)
98 && !qobject_cast<QToolBox *>(parentWidget)
100#if QT_CONFIG(stackedwidget)
101 && !qobject_cast<QStackedWidget *>(parentWidget)
103#if QT_CONFIG(tabwidget)
104 && !qobject_cast<QTabWidget *>(parentWidget)
106#if QT_CONFIG(scrollarea)
107 && !qobject_cast<QScrollArea *>(parentWidget)
109#if QT_CONFIG(mdiarea)
110 && !qobject_cast<QMdiArea *>(parentWidget)
112#if QT_CONFIG(dockwidget)
113 && !qobject_cast<QDockWidget *>(parentWidget)
116 const QString parentClassName = QLatin1StringView(parentWidget->metaObject()->className());
117 if (!d->isCustomWidgetContainer(parentClassName))
118 d->setProcessingLayoutWidget(
true);
120 return QAbstractFormBuilder::create(ui_widget, parentWidget);
127QWidget *QFormBuilder::createWidget(
const QString &widgetName, QWidget *parentWidget,
const QString &name)
129 if (widgetName.isEmpty()) {
131 qWarning() << QCoreApplication::translate(
"QFormBuilder",
"An empty class name was passed on to %1 (object name: '%2').").arg(QString::fromUtf8(Q_FUNC_INFO), name);
135 QWidget *w =
nullptr;
137#if QT_CONFIG(tabwidget)
138 if (qobject_cast<QTabWidget*>(parentWidget))
139 parentWidget =
nullptr;
141#if QT_CONFIG(stackedwidget)
142 if (qobject_cast<QStackedWidget*>(parentWidget))
143 parentWidget =
nullptr;
145#if QT_CONFIG(toolbox)
146 if (qobject_cast<QToolBox*>(parentWidget))
147 parentWidget =
nullptr;
152 if (widgetName ==
"Line"_L1) {
153 w =
new QFrame(parentWidget);
154 static_cast<QFrame*>(w)->setFrameStyle(QFrame::HLine | QFrame::Sunken);
157 const QByteArray widgetNameBA = widgetName.toUtf8();
158 const char *widgetNameC = widgetNameBA.constData();
162#define DECLARE_LAYOUT(L, C)
163#define DECLARE_COMPAT_WIDGET(W, C)
164#define DECLARE_WIDGET(W, C) else if (!qstrcmp(widgetNameC, #W)) { Q_ASSERT(w == 0
); w = new W(parentWidget); }
165#define DECLARE_WIDGET_1(W, C) else if (!qstrcmp(widgetNameC, #W)) { Q_ASSERT(w == 0
); w = new W(0
, parentWidget); }
168#include "widgets.table"
171#undef DECLARE_COMPAT_WIDGET
174#undef DECLARE_WIDGET_1
180 QDesignerCustomWidgetInterface *factory = d->m_customWidgets.value(widgetName);
181 if (factory !=
nullptr)
182 w = factory->createWidget(parentWidget);
186 const QString baseClassName = d->customWidgetBaseClass(widgetName);
187 if (!baseClassName.isEmpty()) {
188 qWarning() << QCoreApplication::translate(
"QFormBuilder",
"QFormBuilder was unable to create a custom widget of the class '%1'; defaulting to base class '%2'.").arg(widgetName, baseClassName);
189 return createWidget(baseClassName, parentWidget, name);
194 qWarning() << QCoreApplication::translate(
"QFormBuilder",
"QFormBuilder was unable to create a widget of the class '%1'.").arg(widgetName);
198 w->setObjectName(name);
200 if (qobject_cast<QDialog *>(w))
201 w->setParent(parentWidget);
209QLayout *QFormBuilder::createLayout(
const QString &layoutName, QObject *parent,
const QString &name)
211 QLayout *l =
nullptr;
213 auto *parentWidget = qobject_cast<QWidget*>(parent);
214 auto *parentLayout = qobject_cast<QLayout*>(parent);
216 Q_ASSERT(parentWidget || parentLayout);
218#define DECLARE_WIDGET(W, C)
219#define DECLARE_COMPAT_WIDGET(W, C)
221#define DECLARE_LAYOUT(L, C)
222 if (layoutName == QLatin1StringView(#L)) {
226 : new L(parentWidget);
229#include "widgets.table"
232#undef DECLARE_COMPAT_WIDGET
236 l->setObjectName(name);
238 qWarning() << QCoreApplication::translate(
"QFormBuilder",
"The layout type `%1' is not supported.").arg(layoutName);
284void QFormBuilder::createConnections(DomConnections *ui_connections, QWidget *widget)
286 Q_ASSERT(widget !=
nullptr);
288 if (ui_connections ==
nullptr)
291 const auto &connections = ui_connections->elementConnection();
292 for (
const DomConnection *c : connections) {
293 QObject *sender = objectByName(widget, c->elementSender());
294 QObject *receiver = objectByName(widget, c->elementReceiver());
295 if (!sender || !receiver)
298 QByteArray sig = c->elementSignal().toUtf8();
300 QByteArray sl = c->elementSlot().toUtf8();
302 QObject::connect(sender, sig.constData(), receiver, sl.constData());
317QLayout *QFormBuilder::create(DomLayout *ui_layout, QLayout *layout, QWidget *parentWidget)
321 bool layoutWidget = d->processingLayoutWidget();
322 QLayout *l = QAbstractFormBuilder::create(ui_layout, layout, parentWidget);
324 int left = 0, top = 0, right = 0, bottom = 0;
325 QFormBuilderExtra::getLayoutMargins(ui_layout->elementProperty(),
326 &left, &top, &right, &bottom);
327 l->setContentsMargins(left, top, right, bottom);
328 d->setProcessingLayoutWidget(
false);