Как удалить тег геометрии QMainWindow в файлах пользовательского интерфейса Qt Designer

Qt Designer добавляет геометрический тег, который содержит размер виджета по умолчанию в абсолютных единицах (пикселях).

Это действительно раздражает, потому что если вы редактируете ui файл на мониторе 4k все ваши uis (по умолчанию) будет отображаться с большими пробелами в системе с более низким DPI.

Если я вручную удаляю этот тег, мои окна будут иметь ожидаемый размер при первом показе, но каждый раз будут редактироваться вручную ui файл каждый раз, когда я открываю их в Qt Designer, чувствует себя неправильно.

Я использую Qt 5.9.

Какой парадигматический способ не позволяет Qt Designer добавить этот тег XML?

В 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

Решение

Я могу удалить теги геометрии в Qt Designer следующим образом:

  1. Откройте новую форму главного окна
  2. Выбрать геометрия в редакторе свойств
  3. Нажмите на красную стрелку справа

Это автоматически изменит размер формы, но изменение размера вручную не восстановит тег геометрии. Однако, если форма имеет строку меню, она также добавит тег геометрии для этого. Так что выберите строка меню в Инспекторе объектов, а затем повторите шаги 2 и 3 выше. После этого я получаю следующий вывод:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget"/>
<widget class="QMenuBar" name="menubar"/>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections/>
</ui>

А после добавления других виджетов / меню / макетов и изменения размера формы теги геометрии больше не появляются. Все это было протестировано с использованием Qt Designer 5.10.1 в Linux.

6

Другие решения

Предполагая, что вы используете qmake для вашего проекта:

Одним из возможных решений будет создание промежуточного «компилятора», который сначала преобразует файл пользовательского интерфейса для удаления тега геометрии и передает его в uic — таким образом вы можете по крайней мере автоматизировать процесс удаления тегов геометрии.

Код для PRO-файла добавит новый компилятор, подобный этому:

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

И изменить FORMS в вашем профессиональном файле RAW_FORMSт.е.

RAW_FORMS += mainwindow.ui #...

Это запустит <some_command> на все ваши пользовательские файлы и сгенерируйте их копию без геометрии в папке сборки в подпапке. Эти сгенерированные пользовательские файлы автоматически передаются FORMS переменная и, таким образом, теперь передается uic создать заголовок.


Сложная часть здесь <some_command> — Вам нужно было бы создать какой-нибудь скрипт (bash, batch, python, XSLT-Transformation, … — все, что вы предпочитаете), который принимает исходный файл XML в качестве входных данных и удаляет тег. XSLT-преобразования — это, вероятно, самый элегантный и надежный способ, но также и самый сложный — вы можете узнать о них больше на w3schools, но я бы, вероятно, просто использовал python, так как он, вероятно, приводит к самому маленькому и простому для понимания сценарию.

(Если вы хотели бы увидеть базовый пример на python, который мог бы выполнить эту работу, я могу возиться с одним позже — просто попросить его в качестве комментария)

1

У меня нет решения, чтобы не допустить написания этого в Designer, я часто нахожу, что проще просто вернуться по коду, что было сделано.

В этом случае я бы предложил добавить вызов setSize(sizeHint()) в конце конструктора вашего главного окна.

1
По вопросам рекламы [email protected]