【问题标题】:How to purge QMainWindow's geometry tag in Qt Designer UI files如何在 Qt Designer UI 文件中清除 QMainWindow 的几何标记
【发布时间】:2018-05-15 19:32:16
【问题描述】:

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

这真的很烦人,因为如果您在 4k 显示器上编辑 ui 文件,您的所有 uis 将(默认情况下)在较低 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>

【问题讨论】:

  • 要在 4K 显示器上“标准化”您的 UI,您可以这样做:只需将其放在 QApplication 应用程序对象初始化之前:QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); QApplication app(argc, argv); 我可以以答案的形式提出,但问题更多的是关于 Designer ?
  • @AlexanderVX 是的,那是不同的。问题是 Qt Designer 设置了特定于开发人员机器的 DPI/分辨率的大小提示。
  • 为什么不试试mainwindow.setGeometry(screen.width() / 4, screen.height() / 4, screen.width() / 2, screen.height() / 2); // 这样你就可以确保它与屏幕成正比。并且您可以检测到它在哪个屏幕上。
  • @AlexanderVX 一方面这不是一个坏主意,另一方面,当我从ui 文件中手动删除该行时,布局是“完美的”。

标签: c++ qt qt5 qt-designer uic


【解决方案1】:

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

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

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

在添加其他小部件/菜单/布局并调整表单大小后,几何标签再也不会出现。这一切都在 Linux 上使用 Qt Designer 5.10.1 进行了测试。

【讨论】:

  • 是的。这看起来是最可靠的方法。似乎所有孩子都需要“重置”才能有效地释放这些标签。
【解决方案2】:

假设您正在为您的项目使用 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 #...

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


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

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

【讨论】:

  • 求助。我不使用 qmake,但是是的,解析 XML 是删除标签的一种策略...
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    • 2019-06-12
    • 1970-01-01
    • 2017-09-05
    • 2019-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多