Liebe Leserinnen, liebe Leser,

in diesem Beitrag teile ich eine ganz vernebelte Methode, mit der die automatische Größenänderung eines Widgets in einem Fenster eingeschaltet werden kann. Weil diese Sache wirklich ein bisschen vernebelt ist, habe ich gedacht, dass das Schreiben dieses Beitrags schon rechfertigt ist, also hier ist ein kleines Fenster, das mithilfe des Qt Creators gemacht ist:



nameEin Dialogfenster gemacht mithilfe des Qt Creators. Alles sieht gut aus…

Das Fenster sieht gut aus, aber falls die Größe des Fensters geändert wird, bekommt man das Folgende:



nameGleiches Fenster nach der Änderung der Größe (beachten Sie bitte die Bildskalierung auf der Webseite)

Das sieht problematisch aus. Um derartige Sachen zu verhindern, könnte man daran denken (genauso wie ich gemacht habe), dass es eine Schaltfläche oder eine Einstellung in Creator gibt, mit dem man das Problem einfach erledigt, aber als es sich herausstellte, gibt es keine. Gemäß der Qt Dokumentation ist die Anwendung von Layouts für die Einschaltung der Größenänderung die empfohlene Methode (scheint die einzige zu sein). Das ist auch bemerkenswert, dass es über die Änderungen nur einen sehr kleinen, kaum wahrnehmbaren Hinweis gibt. Lasst uns den Objektenbaum des Dialogfensters vor und nach der Änderung unter die Lupe stellen:



nameDer Objektbaum vor und nach der Anwendung eines Layouts

Falls Sie den Unterschied auf Anhieb nicht bemerkt haben, bin ich nicht überrascht. Schauen Sie sich bitte das Bild noch mal an, und suchen Sie nach dem kleinen durchgestrichenen Kreis, der jetzt aus dem Icon des QDialog-Objekts fehlt. Das ist der einzige Hinweis, das man optisch bekommen wird. Wenn man die .ui Datei dennoch untersucht, gibt es eine auffälligere Änderung. Das ist der Code vor der Anwendung des Layouts:

Qt .ui XML

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!-- ... -->
<property name="windowTitle">
 <string>Dialog</string>
</property>
 <widget class="QWidget" name="">
  <property name="geometry">
   <rect>
    <x>10</x>
    <y>10</y>
    <width>471</width>
    <height>351</height>
   </rect>
  </property>
  <layout class="QVBoxLayout" name="verticalLayout">
   <item>
    <widget class="QTableView" name="tableView"/>
   </item>
<!-- ... -->

Und nach der Änderung:

Qt .ui XML

1
2
3
4
5
6
7
8
9
10
11
<!-- ... -->
<property name="windowTitle">
 <string>Dialog</string>
</property>
 <layout class="QVBoxLayout" name="verticalLayout_2">
  <item>
   <layout class="QVBoxLayout" name="verticalLayout">
    <item>
     <widget class="QTableView" name="tableView"/>
    </item>
<!-- ... -->

Dem QVBoxLayout Objekt wurde der Name verticalLayout2 hinzugefügt, und gleichzeitig wurde eine große Menge von Information über fest eincodierte Größe entfernt. Natürlich, nach der Änderung funktioniert alles wie erwartet: die Widgets skalieren sich mit dem Fenster.

Es wäre besser, wenn diese Fähigkeit auf einer selbstverständlicheren Weise implementiert wurde, aber lass es die größte unbequemlichkeit von Qt und Creator sein.

Dennoch ist die Lektion des Tages:

Ein Layout sollte für Fenster angewandt werden, um automatische Größenänderung für Widgets zu haben.