【问题标题】:In Qt, how do I make a dialog un-resizeable, yet automatically adjusting its size to the contents?在 Qt 中,如何使对话框无法调整大小,但会根据内容自动调整其大小?
【发布时间】:2011-04-25 16:45:13
【问题描述】:

我有一个 QDialog 实例,由使用 uic 生成的代码的小部件填充。该对话框包含一些垂直布局的标签,我不时弹出对话框以在这些标签中显示一些文本。文本可以是多行的,并且它的长度不是预先确定的。我将垂直大小策略设置为固定,因此用户无法拖动它(没有意义),但我还希望对话框在显示之前更改其大小以适应标签的当前大小。

为此,我在显示之前在 QDialog 上调用了 QWidget::adjustSize(),但它没有按预期工作。显示对话框时,它似乎保留了先前显示的(错误)大小,但是当我在(禁用)垂直调整大小模式下单击鼠标时,对话框突然“捕捉”到(正确)调整后的大小。

有什么方法可以让我的对话框正确显示?

编辑:我把 rubenvb 的建议联系起来,结果是这样的:

QSizePolicy free(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
QSizePolicy fixed(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
dialog->setSizePolicy(free);
dialog->adjustSize();
dialog->setSizePolicy(fixed);
dialog->show();

不幸的是,这似乎并没有改变什么。

【问题讨论】:

标签: c++ qt size qdialog


【解决方案1】:

这不是您希望的答案,它可能不适用于您尝试做的事情,但是,我能够在运行时调整 QWidget 尺寸的唯一方法是通过处理对象的 resizeEvent(..) 方法。这让我可以根据正在使用的字体、行数、可用空间等计算项目的大小,然后在将“事件”传递给基本的 resizeEvent(..) 方法之前相应地调整它们的大小。

我的方法在窗口内、页眉下方、页脚状态区域上方以及菜单按钮列的右侧使用了单个 QWidget 容器。小部件容器,在 resizeEvent() 调用中,将查看它要显示的对象,计算正在使用的字体高度,然后根据它们的尺寸调整一些项目的大小(因为样式表如何选择字体和颜色,等),然后在允许容器小部件获取 resizeEvent() 消息之前调整子小部件尺寸。

所以我对设置窗口大小不是很感兴趣,但我认为容器 QWidget 可能会以同样的方式工作?我更感兴趣的是将尺寸设置为一些美观的尺寸,具体取决于显示器的尺寸。

希望对您有所帮助。

【讨论】:

  • 好吧,如果事实证明有必要,我想我也必须经历这个,但我宁愿不经历。 :) adjustSize() 对我来说很好用,只是我似乎需要在显示对话框之前以某种方式强制进行某种更新。
【解决方案2】:

按照正确的顺序做所有事情:

  1. 对话框未显示。对话框可调整大小。

  2. 计算新尺寸,设置新尺寸。

  3. 将对话框设置为不可调整大小。

  4. 显示对话框。

  5. 隐藏对话框,转到第一步。

【讨论】:

  • 试过了,没用;见编辑。不过,这似乎是个好主意。 :(
  • 哪部分不起作用?您确定您通过 sizeHint 和朋友之类的东西获得了正确的尺寸吗?
  • 一切都像以前一样发生的部分?我没有打扰 sizeHint,我认为 Designer 的值会很好。
  • @neuviemeporte:知道它的尺寸非常重要,因为adjustSize 使用“sizeHint 和朋友”:doc.qt.nokia.com/latest/qwidget.html#adjustSize 尝试手动尺寸,看看我的方法是否真的有效,并且您的问题肯定是基于sizeHint 中出现的问题(不是您的错)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-17
相关资源
最近更新 更多