如何在 Qt Designer UI 文件中清除 QMainWindow 的几何标记

How to purge QMainWindow's geometry tag in Qt Designer UI files

Qt Designer 添加了一个几何标记,其中包含以绝对单位(像素)表示的小部件的默认大小。

这真的很烦人,因为如果您在 4k 显示器上编辑 ui 文件,您所有的 ui 将(默认情况下)在较低的显示器上显示大量白色 space DPI系统。

如果我手动删除这个标签,我的 windows 在第一次显示时会有预期的大小,但是每次我在 Qt Designer 中打开它们时手动编辑每个 ui 文件感觉不对。

我正在使用 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>

我可以像这样删除 Qt Designer 中的几何标记:

  1. 打开一个新的 Main Window 表单
  2. Select 几何 属性 编辑器
  3. 点击右边的红色箭头

这将自动调整表单大小 - 但手动调整它不会恢复几何标记。但是,如果表单有一个菜单栏,它还会为此添加一个几何标记。所以在 Object Inspector 中 select menubar 然后重复上面的步骤 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>

添加其他 widgets/menus/layouts 并调整表单大小后,几何标记再也不会出现。这都是在 Linux.

上使用 Qt Designer 5.10.1 测试的

假设您正在为您的项目使用 qmake:

一个可能的解决方案是创建一个中间 "compiler" ,它首先转换 ui 文件以删除几何标记并将其传递给 uic - 这样你就可以至少自动执行删除几何标签的过程。

PRO-file 的代码会像这样添加一个新的编译器:

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

并将您的 pro 文件中的 FORMS 更改为 RAW_FORMS,即

RAW_FORMS += mainwindow.ui #...

这将 运行 您所有 ui-files 上的 <some_command> 并在子文件夹中的 build 文件夹中生成不带几何图形的副本。那些生成的 ui 文件会自动传递给 FORMS 变量,因此现在传递给 uic 以创建 header.


这里棘手的部分是 <some_command> - 您必须创建某种脚本(bash、批处理、python、XSLT-Transformation、... - 无论你喜欢什么)将原始 xml 文件作为输入并删除标签。 XSLT-Transformations 可能是最优雅和可靠的方式,但也是最复杂的 - 您可以在 W3schools 了解更多关于它们的信息,但我可能只使用 python,因为它可能导致最小且最容易理解的脚本。

(如果你想在 python 中看到一个可以完成这项工作的基本示例,我可以 fiddle 当天晚些时候拿出来 - 只需作为评论索取即可)

我没有阻止 Designer 编写此内容的解决方案,我经常发现通过代码还原已完成的内容更简单。

在这种情况下,我建议在主 window.

的构造函数末尾添加对 setSize(sizeHint()) 的调用