Can we set different alignments for widgets in QLayout? - qt

I have many widgets in a horizontal layout. I have set alignment to vertical center and hence all the widgets are proportionately placed and the content margins are set to (0, 0, 0, 0).
I want to add one more widget which is aligned to the top and not the center.
Is there a way to add widgets with different alignment in the same layout?
One solution: To add this last widget to a vertical layout and align it to top and add that vertical layout to the horizontal layout. But this adds one more layout which i am thinking can be avoided.

Related

Buttons alignment does not work in Vaadin v.23

I need to place three buttons at the bottom of my page and I want them to be in the left corner, center and right corner respectively. I did create HorizontalLayout into which I added my button. I am fighting with all kinds of alignments for over three days, but whatever I do, buttons remains in the left corner. Here is my code:
HorizontalLayout bottomLayout = new HorizontalLayout();
bottomLayout.setWidthFull();
bottomLayout.setHeight("82px");
bottomLayout.add(buttonA, buttonB, buttonC);
// bottomLayout.setAlignItems(Alignment.STRETCH);
bottomLayout.setAlignSelf(Alignment.END, buttonC);
bottomLayout.setAlignSelf(Alignment.START, buttonA);
bottomLayout.setAlignSelf(Alignment.CENTER, buttonB);
Please do tell me what I am doing wrong and how to correct it.
Also, all my buttons are 80px high and while first two looks vertically aligned to each other, the third one looks couple pixels higher. How do I align them vertically as well?
What you're looking for is bottomLayout.setJustifyContentMode(JustifyContentMode.BETWEEN);
Explainer:
Layouts are 2-dimensional, so the elements in them can be aligned in two ways: horizontally and vertically.
In CSS FlexBox layout model terminology
justification refers to alignment along the layout's direction (horizontally for horizontal layouts)
alignment refers to "cross-axis" alignment (vertically for horizontal layouts)
So setAlignItems and setAlignSelf both refer to the alignment above, wheras setJustifyContentMode refers to justification above.
I have to admit it's really not the most intuitive API. It is like that because it tries to follow the CSS FlexBox model and terminology.

Disable widget stretching in QScrollArea layout

I am trying to disable the stretching of widgets in my QScrollArea's vertical layout.
I would like to have a scroll area which resizes it's contents horizontally to fit the scroll area's width (so that the whole widget is visible), but has a scrollbar vertically if needed.
I only managed to achieve this by setting my widgets width so that it fits without a horizontal scrollbar getting added.

Widget Margin vs layout margin

There is SetContentsMargin both in QWidget and layout. So is that 2 margins getting added or both are operating for the same margin. Take an example where a layout is set to the widget and the margins are set to both the widget and the layout, Is there a standard approach by Qt? And does all the in-built layout of Qt follow that? What is the original idea behind all this?
On the widget the margins are an area within the widget.
So if you have a widget with a size of 100 x 50 and margins of (5,6,5,6), then you will have a contentsRect() of QRect(5,6 90x38).
The widget can draw in its margins and as far as QLayout is concerned these margins are counted as in the widget. These margins are used to inform other widgets and subclasses of where is the "core" of the widget. This can be useful to tell subclasses where they are allowed to draw.
The margins for layouts are the same. They represent an area within the layout. If you have a layout with a left margin of 10 px, the first widget will render 10 px away from the border of the layout. If this widget has a left margin of 5 px, then the meaningful content of the widget will start 15 px away from the layout border. However, as I said before, the part for 10 px to 15 px is within the widget and the widget can draw in this space.
In layouts you also have spacing, as for the margins, it adds up to the widgets margins.
Additional info
If you place a layout inside a widget, the layout will only occupy the content rectangle (contentsRect()). Then the layout will have its own margin, counted inside the layout.
To conclude, the total visible margin is the margin of the parent widget + the margin of the layout + the margin of the child widget.

How to center a responsive page layout?

I'm trying to use a CSS grid from this page, but I can't seem to figure out how the outside margins of the layout is done.
How do you define the content such that it scales responsively up to a certain width, then becomes a fixed-width, centered layout when the window is larger than that size?
http://www.responsivegridsystem.com/

QT: Position tabs within QTabBar block

There is a QTabBar element with a vertical size policy which is expanding. I want to make the tabs to be aligned to the bottom of the QTabBar element box, but they are always appearing from the top.
I have tried styling QTabBar and QTabBar::tab with different combinations of vertical-align: bottom, alignment: bottom;, bottom:0; but with zero luck. It seems that the only alignment that actually work is when I align horizontally.
Current results:
The tabs are separated from where the content will go. And before suggesting me to not use an expanding vertical policy. I have to do it like this, I have my reasons.
The widget alignment can be set in the containing layout, and you have to use a non-zero stretch value:
vbox->addWidget(tabBar, 1, Qt::AlignBottom);
vbox->addWidget(otherWidget, 1);
The tab will be correctly aligned, with empty space above it, but that space won't be a part of the QTabBar (the expanding policy will be ignored).
If you need to put something in the space above the QTabBar, you could insert it at the bottom of another intermediary QWidget and insert that widget into the layout instead of the QTabBar.

Resources