1
votes

A part of my form contains QGroupBox (Status Box) with 4 child QGroupBoxes arranged in a grid layout (2x2). Two bottom QGroupBoxes (Widget 1 Box and Widget 2 Box) contain widgets of fixed size (with set minimumSize and maximumSize) so they're non-resizable at all in both directions. Because of that rigid size constraints top row of QGroupBoxes (Summary Box and Helper Box) can only be resized in vertical direction.

And here comes the troublesome part. Top-left QGroupBox (Summary Box) have grid layout 5x3 while top-right (Helper Box) have vertical layout with 6 rows. If I have naive widget placement as shown on picture 1 Qt is enlarging vertical size of both labels in top row to make height of both QGroupBoxes equal (see red arrows on picture 1).

Picture 1 - naive widget placement

This is definitely that I don't want so I've added vertical spacer to the bottom of Summary Box and from the first glance it worked (picture 2). But only from the first glance... What you see is the minimum height of my whole form and the bottom side of spacer and last QCheckBox in the Helper Box seems to be aligned.

Picture 2 - vertical spacer added

If I'm expanding my form vertically this spacer grows a bit and that causes the increase of height of both top QGroupBoxes. As a result spacing between QCheckBoxes increases too and we can also see that top and bottom spacing are unequal for the top-right box (see red arrows on picture 3).

enter image description here

I've tried to play with sizeType for my vertical spacer. If I set it to Minimum or MinimumExpanding then the spacer doesn't grow on resize (and doesn't shrink, too) but it appears to be expanded to the size as on picture 3 (corrupting spacings between QCheckBoxes too). If I set it to Maximum, Preferred or Expanding then I observe the same behavior as described above for picture 3.

What is the proper way to achieve alignment for two QGroupBoxes in a row of grid without affecting spacing between elements (e. g. in that case make vertical spacer to fit only single row of grid layout and never expand/shrink)?

1

1 Answers

1
votes

Items will be aligned if both QGroupBoxes have same count of children and each row have at least one child with Expanding vertical policy. Instead of spacer use QWidget

I removed unrelated widgets and reduces number of rows to 4 for demonstration purposes (less xml).

design

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Form</class>
 <widget class="QWidget" name="Form">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>467</width>
    <height>314</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Form</string>
  </property>
  <layout class="QHBoxLayout" name="horizontalLayout">
   <item>
    <widget class="QGroupBox" name="groupBox">
     <property name="title">
      <string>GroupBox</string>
     </property>
     <layout class="QGridLayout" name="gridLayout">
      <item row="0" column="0">
       <widget class="QLabel" name="label">
        <property name="sizePolicy">
         <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
          <horstretch>0</horstretch>
          <verstretch>0</verstretch>
         </sizepolicy>
        </property>
        <property name="text">
         <string>TextLabel</string>
        </property>
       </widget>
      </item>
      <item row="3" column="2">
       <widget class="QWidget" name="dummy" native="true">
        <property name="sizePolicy">
         <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
          <horstretch>0</horstretch>
          <verstretch>0</verstretch>
         </sizepolicy>
        </property>
       </widget>
      </item>
      <item row="1" column="0" colspan="2">
       <widget class="QLabel" name="label_4">
        <property name="sizePolicy">
         <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
          <horstretch>0</horstretch>
          <verstretch>0</verstretch>
         </sizepolicy>
        </property>
        <property name="text">
         <string>TextLabel</string>
        </property>
       </widget>
      </item>
      <item row="1" column="2">
       <widget class="QLineEdit" name="lineEdit"/>
      </item>
      <item row="2" column="2">
       <widget class="QLineEdit" name="lineEdit_4">
        <property name="sizePolicy">
         <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
          <horstretch>0</horstretch>
          <verstretch>0</verstretch>
         </sizepolicy>
        </property>
       </widget>
      </item>
      <item row="2" column="0">
       <widget class="QLabel" name="label_5">
        <property name="sizePolicy">
         <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
          <horstretch>0</horstretch>
          <verstretch>0</verstretch>
         </sizepolicy>
        </property>
        <property name="text">
         <string>TextLabel</string>
        </property>
       </widget>
      </item>
     </layout>
    </widget>
   </item>
   <item>
    <widget class="QGroupBox" name="groupBox_2">
     <property name="title">
      <string>GroupBox</string>
     </property>
     <layout class="QVBoxLayout" name="verticalLayout">
      <item>
       <widget class="QCheckBox" name="checkBox">
        <property name="sizePolicy">
         <sizepolicy hsizetype="Minimum" vsizetype="Expanding">
          <horstretch>0</horstretch>
          <verstretch>0</verstretch>
         </sizepolicy>
        </property>
        <property name="text">
         <string>CheckBox</string>
        </property>
       </widget>
      </item>
      <item>
       <widget class="QCheckBox" name="checkBox_4">
        <property name="sizePolicy">
         <sizepolicy hsizetype="Minimum" vsizetype="Expanding">
          <horstretch>0</horstretch>
          <verstretch>0</verstretch>
         </sizepolicy>
        </property>
        <property name="text">
         <string>CheckBox</string>
        </property>
       </widget>
      </item>
      <item>
       <widget class="QCheckBox" name="checkBox_5">
        <property name="sizePolicy">
         <sizepolicy hsizetype="Minimum" vsizetype="Expanding">
          <horstretch>0</horstretch>
          <verstretch>0</verstretch>
         </sizepolicy>
        </property>
        <property name="text">
         <string>CheckBox</string>
        </property>
       </widget>
      </item>
      <item>
       <widget class="QCheckBox" name="checkBox_6">
        <property name="sizePolicy">
         <sizepolicy hsizetype="Minimum" vsizetype="Expanding">
          <horstretch>0</horstretch>
          <verstretch>0</verstretch>
         </sizepolicy>
        </property>
        <property name="text">
         <string>CheckBox</string>
        </property>
       </widget>
      </item>
     </layout>
    </widget>
   </item>
  </layout>
 </widget>
 <resources/>
 <connections/>
</ui>