Adding widgets dynamically to layout, causes to them to be misplaced
-
As shown here, when I add my widgets to the main window, they are misplaced.
void QtDice::enableUserWidget() { userwidget = new UserWidget("", this); m_ui->verticalLayout_Widget->addWidget(userwidget); setLayout(m_ui->verticalLayout_Widget); }
Can someone give me a hint what should I look for?
-
Hi,
Why are you calling setLayout ? Since you have a designer based UI you likely already have the layout set on something, no ?
-
@SGaist said in Adding widgets dynamically to layout, causes to them to be misplaced:
Hi,
Why are you calling setLayout ? Since you have a designer based UI you likely already have the layout set on something, no ?
I added it as a last attempt. Nothing changed though, the same misplacement happened before.
-
It looks like the label isn't in the vertical layout, is it ?
-
Since you are adding a widget to a vertical layout and said widgets comes on top of another one then that other one is not in the same layout (or any layout for that matter)
-
I am thinking that I tried vertical and grid layouts, but not horizontal. Before I try this next morning, is there something I am missing with spacers?
I also could not solve this way.
-
Where exactly is that widget supposed to come ? And can there be more than one ?
-
In the third picture of the link, there is a layout selected which is called
verticalLayout_Widgets
. The widget is supposed to be placed there and only once but that is something I took care with some code. -
Why not in designer using the promotion feature ?
-
@Petross404_Petros-S
Hi
Promotion feature is a super replace at runtime.
During design, you say this QWidget should become this type when run.
Designer will then use the actual type so when app is run, your control is
used and not the plain widget.
http://doc.qt.io/qt-5/designer-using-custom-widgets.htmlThis allows light integration where you can desgin with your custom widget but do not have to make a full
plugin for integration. -
What happens it that my widget is now loaded upon startup, while I need it to be loaded if and when the use clicks a checkbox. I guess I wan't clear about the term dynamic loading...
-
Hi
- my widget is now loaded upon startup
you mean, after you used promotion, they are constructed with the main window
or where you promoted them ?
This is expected and often you can just hide them, and then show if enabled in checkbox.
If you strictly really need only to construct them on demand, you cant use promotion directly. -
@mrjj Yes, I think so too. Right now I managed to put the widget on the layout with the use of a vertical spacer (enabled and shown here). After the widget is created and shown, the whole window expands a little so the layout and it's widget can be visible.
The thing is that I can't "resize" the layout(?) and the whole window to it's original, smaller size. It seems that once the layout is "stretched" to show the widget, it stays that way when the widget is deleted. This leaves an ugly void space where the widget was placed.
-
@Petross404_Petros-S
Hi
Normally layouts will "contract". I have yet to experience
one that leaves a hole if i remove widget. Maybe boxlayout. -
Maybe boxlayout.
You mean I should try boxlayout? Designer doesn't have one though...
@Global-Moderators Please, correct my title. I meant to write "...causes them to be misplaced".
-
@Petross404_Petros-S
no, no i mean maybe box layout would / might/perhaps leave a hole but all other layouts would
contract if you remove a widget.There is something else wrong.
Do you use TakeAt to remove from layout ?
https://doc.qt.io/qt-5.10/qboxlayout.html#takeAt
Its the only valid way to remove a widget. -
Well, one thing I know is that the custom widget's size constraints had to set to a minimum. It used quite a lot of space so it was centered on top of another layout/widget. Now it's loaded where it should, but after it's deletion there still is a void space.
That's the code:
void QtDice::enableUserWidget() { userwidget = new UserWidget(this); m_ui->gridLayout_Widget->addWidget(userwidget); } void QtDice::deleteUserWidget() { m_ui->gridLayout_Widget->removeWidget(userwidget); userwidget->setParent(nullptr); delete userwidget; }
Other suspects could be the main form (i.e. the QtDice qmainwindow) and it's size policies or the vertical spacer. I tried almost every combination and I am out of ideas.
Do you use TakeAt to remove from layout ?
Ebook Mastering Qt5, suggested the
QLayout::removeWidget
, so...