Qt Designer ajoute une balise de géométrie qui contient la taille par défaut du widget en unités absolues (pixels).

C'est vraiment ennuyeux car si vous éditez un fichier ui sur un moniteur 4k, tous vos ui s'afficheront (par défaut) avec un espace blanc massif sur un système DPI inférieur.

Si je supprime manuellement cette balise, mes fenêtres ont la taille attendue lors du premier affichage, mais l'édition manuelle de chaque fichier ui chaque fois que je les ouvre dans Qt Designer me semble mal.

J'utilise Qt 5.9.

Quelle est la manière paradigmatique d'empêcher Qt Designer d'ajouter cette balise XML?

Dans example.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Example</class>
 <widget class="QMainWindow" name="Example">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>970</width>
    <height>1371</height>
   </rect>
  </property>
6
Mikhail 1 août 2017 à 19:44

2 réponses

Je n'ai pas de solution pour empêcher Designer d'écrire ceci, je trouve souvent plus simple de simplement revenir par code sur ce qui a été fait.

Dans ce cas, je suggérerais d'ajouter un appel à setSize(sizeHint()) à la fin du constructeur de votre fenêtre principale.

1
Aurélien Gâteau 15 mai 2018 à 11:32

En supposant que vous utilisez qmake pour votre projet:

Une solution possible serait de créer un "compilateur" intermédiaire qui transforme d'abord le fichier ui pour supprimer la balise de géométrie et qui le transmet à uic - de cette façon, vous pouvez au moins automatiser le processus de suppression des balises de géométrie.

Le code du fichier PRO ajouterait un nouveau compilateur comme celui-ci:

uiungeom_c.name = fix ui of ${QMAKE_FILE_IN}
uiungeom_c.input = RAW_FORMS
uiungeom_c.variable_out = FORMS
uiungeom_c.commands = /path/to/<some_command> ${QMAKE_FILE_IN} ${QMAKE_FILE_OUT}
uiungeom_c.output = ./.uifix/${QMAKE_FILE_BASE}.ui
uiungeom_c.CONFIG += target_predeps
QMAKE_EXTRA_COMPILERS += uiungeom_c

Et changez le FORMS dans votre fichier pro en RAW_FORMS, c'est-à-dire

RAW_FORMS += mainwindow.ui #...

Cela exécutera le <some_command> sur tous vos fichiers ui et en générera une copie sans la géométrie dans votre dossier de construction dans un sous-dossier. Ces fichiers ui générés sont automatiquement passés à la variable FORMS et sont donc maintenant transmis à uic pour créer l'en-tête.


La partie la plus délicate ici est la <some_command> - Vous auriez à créer une sorte de script (bash, batch, python, XSLT-Transformation, ... - ce que vous préférez) qui prend le fichier xml d'origine comme entrée et supprime l'étiquette. Les transformations XSLT sont probablement le moyen le plus élégant et le plus fiable, mais aussi le plus compliqué - vous pouvez en savoir plus à leur sujet sur W3schools, mais j'utiliserais probablement juste python, car il conduit probablement le script le plus petit et le plus facile à comprendre.

(Si vous souhaitez voir un exemple de base en python qui pourrait faire le travail, je peux en jouer un plus tard dans la journée - demandez-le simplement en commentaire)

1
Felix 13 mai 2018 à 09:25