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



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

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

如果我手动删除此标签,我的窗口在首次显示时具有预期的大小,但是每次在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. 打开新的主窗口窗体
  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>

添加其他小部件/菜单/布局并调整表单大小后,几何标签永远不会重新出现。这一切都是在Linux上使用Qt Designer 5.10.1测试的。

假设你在项目中使用 qmake:

一种可能的解决方案是创建一个中间"编译器",该编译器首先转换 ui 文件以删除几何标记并将其传递给 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

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

RAW_FORMS += mainwindow.ui #...

这将对所有 ui 文件运行<some_command>,并在子文件夹中的构建文件夹中生成不包含几何图形的副本。这些生成的 ui 文件会自动传递给FORMS变量,因此现在传递给uic以创建标头。


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

(如果你想看到一个可以完成这项工作的python基本示例,我可以在当天晚些时候摆弄一个 - 只需要求它作为评论(

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

在这种情况下,我建议在主窗口的构造函数末尾添加对setSize(sizeHint())的调用。

最新更新