在Qt中,我如何使对话框不可调整大小,但自动调整其大小的内容

In Qt, how do I make a dialog un-resizeable, yet automatically adjusting its size to the contents?

本文关键字:调整 可调整 Qt 何使 对话框      更新时间:2023-10-16

我有一个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();

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

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

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

所以我对设置窗口大小不太感兴趣,但我认为容器QWidget可能以同样的方式工作?我更感兴趣的是根据显示器的尺寸将尺寸设置为美观的大小。

按正确的顺序做:

  1. 对话框未显示。

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

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

  4. 显示对话框。

  5. 隐藏对话框,进入第一步