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中的几何标签:
- 打开新的主窗口窗体
- 在属性编辑器中选择几何图形
- 单击右侧的红色箭头
这将自动调整表单大小 - 但手动调整其大小不会恢复几何标记。但是,如果表单具有菜单栏,则还将为此添加几何标记。因此,在对象检查器中选择菜单栏,然后重复上面的步骤 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())
的调用。