如何在Qt Designer UI文件中清除QMainWindow的几何标记
How to purge QMainWindow's geometry tag in Qt Designer UI files
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())
的调用。
- 清除前检查矢量
- ifstream文件在从行中读取时被清除
- WINAPI 注册应用程序重新启动时不清除打开的套接字
- 如何清除/清空已打开的文件C++
- 如何在 c++ 中清除矢量容量?
- 可以清除递归函数中的变量吗?
- 在清除 istream 之前,我不应该需要取消获取它吗?
- 结构成员在访问时被清除
- 清除输入缓冲区后未提取字符串流
- SDL_ttf清除我之前和将来的所有渲染
- 如何使用内存集清除字符数组
- 有没有办法在c ++中清除空数组,请检查下面的代码以获取说明
- QTreeWidgetItem 设置不可选择将清除选择
- libQGLViewer 如何在没有清除缓冲区的情况下绘制
- 清除具有已删除赋值运算符的成员的类实例
- 清除结构向量时会发生什么?
- 显式清除 std::move 之后的源资源
- QMainWindow 不会在条件块中打开
- C++ - 重置字符串流不会重置获取位置或清除标志吗?
- 如何在Qt Designer UI文件中清除QMainWindow的几何标记