必要时扩展Qt界面

3
我正在开发一个Qt项目,发现某些GUI表单存在持续问题。在KDE(下图)和Windows上,表单看起来正常,但是当应用在任何基于GNOME3的系统上时(如Unity或GNOME3本身),表单的某些部分被隐藏了。(上图中,位于“排序升序”单选按钮下方的所有内容都被截断了)
问题似乎出在Qt布局如何处理大字号上。如果用户使用普通大小的系统字体(<= 10pt),一切都正常。如果他们使用更大的字体,则表单不足以容纳所有内容。由此bug影响的其他表单仅仅是过于拥挤,不像将必要的控件排除在界外这么严重。如果我放大对话框,布局不想自行调整大小以充分利用新增的空间。是否有一种简单的方法可以让它这样做,还是需要硬编码呢?最初,该代码在运行时防止对话框改变大小,但恢复该功能并没有解决该bug。即使对话框可以扩展,问题也在于布局不会随之扩展。
到目前为止,我已经使所有受影响的表单超大以弥补这个bug,但是在Windows和KDE系统上,这些对话框比需要的尺寸大得很奇怪。是否有一种方法可以使受影响的对话框/布局在运行时自行调整大小,以便所有内容都适当地适应?如果有的话,程序将如何检测界面中的部分是否超出边界?我希望不要强制使用某个字体大小(某些人可能因视力问题而喜欢使用大字体)。
提前感谢您的帮助。
图1:选项的一部分被截断(就在“排序升序”下面)
图2:这是它应该看起来的样子

1
我不知道你的布局规划是怎样的,但如果它不能随着对话框一起扩展,至少要让所有的控件都可见,那么这似乎是布局存在问题。 - Caleb Huitt - cjhuitt
Caleb Huitt很可能是正确的。这里使用布局有问题。请展示您如何构建UI。 - divanov
1个回答

3
解决方法是使用不同的方式来显示表单,更加动态化。我将描述一种成功应用于 Windows 并支持 96 和非常高的 DPI 模式(超过 120)的方法。
1. 查询操作系统并获取用户选择的特定系统项目字体;例如用于窗口标题或系统对话框的字体。如果可能,请使用 True Type 字体。同时,如果需要,您也可以允许用户稍后选择自己的字体。
2. 使用该字体构建一个字符串对象,用于标签或编辑控件(我不知道 QT 是什么,但对于 Windows,它是 GetTextExtentPoint32),并将其传递给系统函数以确定在您的环境中字符串的宽度和高度。
3. 根据上述值,放置控件并动态调整填充周围的控件大小,以满足您的需求。对于按钮,您可能始终会添加一定比例的像素在按钮上下方以取悦用户。
4. 对于图形元素,如位图和 JPEG,再次查询监视器的当前 DPI 设置,并使用较大的、预先制作好的资源。当然,所有与这些元素相关的文本都将根据需要进行动态放置。
请注意,在 Windows 上,您需要使用清单将您的 exe 标记为高 DPI 感知。

1
对于标签,QFontMetrics(QApplication::font(), this).boundingRect("My Label") 返回使用当前绘制设备的像素设置的字符串的边界框。+1 - cmannett85
这种做法绝对是错误的,而且不具备可移植性。问题在于Qt UI的构建出现了错误,使用特定于系统的调用只会带来更多问题。 - divanov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接