【问题标题】:How can I adjust the size of a QDialog according to its title length?如何根据标题长度调整 QDialog 的大小?
【发布时间】:2020-01-26 15:41:09
【问题描述】:

我的对话窗口的一个标题被缩短(如“我的对话...”)。如果对话框稍微宽一点,整个标题会完全显示出来,看起来会更好。

似乎 Qt 中没有设置可以做到这一点。我在这里找到了QMessageBox 的破解方法:Can QMessageBox::about adjust size to title length?,但它并不通用。例如,它还必须考虑窗口标题左侧和右侧的图标大小,以计算一个非常好的最小尺寸,其中标题仍然完全显示。

有没有一种通用的方法可以做到这一点?是否还有一种简单的方法可以做到这一点?或者这是过度工程?

【问题讨论】:

  • @rafaelgonzalez 是的,这是我引用的不普遍的问题。
  • IMO,根据标题字符串的长度调整对话框大小是不良 GUI 设计的一个例子,除非有特定原因。
  • @vahancho 为什么? (我不想说你错了,我只是想知道你的理由。)
  • @BenjaminBihler,因为我设想了以下场景:假设您有一个窗口,在其标题栏上显示您加载的文件的完整路径。现在您打开一个包含相当长的完整路径的文件 - 您的窗口会自发扩展,可能会扩展至屏幕外。下次您打开另一个文件时,您的窗口会缩小等等。你喜欢吗?我没有,因为我想自己控制窗口大小。这就是 Qt 自动剪切标题字符串而不提供扩展窗口的 API 的原因。

标签: c++ qt dialog resize


【解决方案1】:

不仅这个目标是有问题的(见vahanco评论)而且很难实现,因为窗口标题栏根本不是Qt领域:除了能够设置它的文本并设法使用窗口标志显示或隐藏关闭/最小/最大按钮,那里几乎没有其他控制。

顺便说一句,设置对话框最小宽度(可以)为整个文本腾出空间的一种非常原始的方法如下:

const QString text = "Very very very very very very very very very very very very very long window title";
setWindowTitle(text);

QFontMetrics metrics(font(), this);
setMinimumWidth( metrics.horizontalAdvance(text));

这不会开箱即用,而且文本很可能会保持剪切,因为使用的字体假定与标题栏中使用的字体相同(通常是' t) 并且我们没有考虑框架宽度、图标宽度、标题栏按钮宽度以及由窗口管理器拥有且 Qt 完全不知道的所有其他内容。

因此,您可以算出所有这些东西需要多少额外空间,并使用完全任意的额外填充来调整宽度,例如

setMinimumWidth( metrics.horizontalAdvance(text) + 256);

也许一开始就得到你想要的(如果你仍然真的想要的话)。

【讨论】:

    猜你喜欢
    • 2016-11-23
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 2011-05-07
    • 2015-08-28
    • 1970-01-01
    • 2016-05-12
    相关资源
    最近更新 更多