Utils: Emerge widgets from LayoutItem

This allows us to call e.g. PushButton{}.emerge(); without having to
add another unnecessary layout.

Change-Id: Ica26f4776dee1843e1f40c238e1f3c1a54d14ea5
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Marcus Tillmanns
2023-10-12 10:01:49 +02:00
parent 1a1dcfc5c7
commit 644e88ae2e
2 changed files with 42 additions and 3 deletions

View File

@@ -573,11 +573,28 @@ void LayoutItem::attachTo(QWidget *w) const
QWidget *LayoutItem::emerge()
{
LayoutBuilder builder;
builder.stack.append(Slice());
addItemHelper(builder, *this);
if (builder.stack.empty())
return nullptr;
QTC_ASSERT(builder.stack.last().pendingItems.size() == 1, return nullptr);
ResultItem ri = builder.stack.last().pendingItems.takeFirst();
QTC_ASSERT(ri.layout || ri.widget, return nullptr);
if (ri.layout) {
auto w = new QWidget;
attachTo(w);
w->setLayout(ri.layout);
return w;
}
return ri.widget;
}
static void layoutExit(LayoutBuilder &builder)
{
builder.stack.last().flush();
@@ -861,6 +878,17 @@ LayoutItem title(const QString &title)
};
}
LayoutItem windowTitle(const QString &windowTitle)
{
return [windowTitle](QObject *target) {
if (auto widget = qobject_cast<QWidget *>(target)) {
widget->setWindowTitle(windowTitle);
} else {
QTC_CHECK(false);
}
};
}
LayoutItem text(const QString &text)
{
return [text](QObject *target) {

View File

@@ -38,5 +38,16 @@ int main(int argc, char *argv[])
},
}.emerge()->show();
Group {
windowTitle("Group without parent layout"),
title("This group was emerged without parent layout"),
Column {
Splitter {
new QTextEdit("First Widget"),
new QTextEdit("Second Widget"),
},
}
}.emerge()->show();
return app.exec();
}