6

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>
4

3 回答 3

6

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

  1. 打开一个新的主窗口窗体
  2. 在属性编辑器中选择几何图形
  3. 点击右边的红色箭头

这将自动调整表单的大小 - 但手动调整它的大小不会恢复几何标记。但是,如果表单有一个菜单栏,它也会为此添加一个几何标记。因此,在 Object Inspector 中选择菜单栏,然后​​重复上面的步骤 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 进行了测试。

于 2018-05-10T18:26:27.763 回答
1

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

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

于 2018-05-15T11:32:16.707 回答
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

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

RAW_FORMS += mainwindow.ui #...

这将<some_command>在您的所有 ui 文件上运行并生成它们的副本,而不在子文件夹中的构建文件夹中生成几何图形。那些生成的 ui 文件会自动传递给FORMS变量,因此现在传递uic给创建标题。


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

(如果您想在 python 中看到一个可以完成这项工作的基本示例,我可以在当天晚些时候整理出一个 - 只需将其作为评论提出)

于 2018-05-13T09:25:47.927 回答