【问题标题】:QLabel cutting off text on resizeQLabel 在调整大小时切断文本
【发布时间】:2012-12-15 19:20:50
【问题描述】:

我有一个自定义小部件,它具有 QVBoxLayout 的整体布局。它包含几个标签、一个 QFormLayout、一个按钮和一个用来吃掉所有多余空间的拉伸。其中一个标签可能非常大,因此我试图确保不会出现文本不可读的奇怪情况。小部件包含在 QScrollArea 中,以确保如果用户缩小整个窗口,仍然可以看到小部件的所有方面。

QLabel 似乎可以很好地调整大小,但一旦达到某个窄点,它就会切断标签底部的几行,并将空间分配给小部件底部的拉伸部分。

我在没有设计器的情况下在代码中完成这一切,所以我完全有可能只是遗漏了一些东西。子组件按以下顺序添加到整体 QVBoxLayout:

OverallLayout = new QVBoxLayout(this);
Title         = new QLabel();
Description   = new QLabel();
SubRegion     = new QFormLayout();
Button        = new QButton();
...
// set text values, wordWrap(true), and Font for labels
OverallLayout->addWidget(Title);
OverallLayout->addWidget(Description);
OverallLayout->addLayout(SubRegion);
OverallLayout->addStrut(MIN_DIST);
OverallLayout->addWidget(Button);
OverallLayout->addStretch(STRETCH_FACTOR);

测试结果:检查从 QLabel 的 sizeHint() 函数返回的结果,返回的值似乎没有随着小部件水平收缩而改变。但是,QLabel 确实会扩展以占用更多的垂直空间(153 与 103 的提示),但不足以容纳所有文本。当 QLabel 首次显示时,它的像素比它的 sizeHint 少,但对于它的 heightForWidth 量仍然足够。调整大小时,它比它的 heightForWidth 量少 30,但比它的 sizeHint 多。

我已经检查过,大 QLabel 的 hasHeightForWidth() 和 wordWrap() 值设置为 true。我究竟做错了什么?

【问题讨论】:

  • 你能在这些小部件被添加到布局的地方添加代码 sn-p 吗?我认为您应该通过 setMinimumHeight() 设置 QLabel 的最小大小,以便没有截止。或者,您可以为间隔元素设置最大高度值。
  • 我想修复它的一种方法是链接到调整大小的方法,并将最小高度设置为描述标签的 heightForWidth(width) 值。不过这似乎有点笨拙,所以我想知道让布局管理器完成其工作的正确方法是什么。
  • 但是使用setMinimumHeight() 的建议呢?
  • 我目前正在通过拦截resizeEvent,计算新宽度的heightForWidth,然后执行setMinimumHeight()来做到这一点。但是,这似乎很笨拙(根据我之前的评论),我试图找到一种方法让 Qt 自行处理。是我在初始化时做错了什么,还是拦截 resizeEvent 真的是解决这个问题的最佳方法?

标签: c++ qt layout qlayout


【解决方案1】:

我最终采用了覆盖小部件的 resizeEvent(QResizeEvent *evt) 函数的方法,以便动态设置 QLabel 的最大值。

void MyWidget::resizeEvent (QResizeEvent *evt) {
   int newHeight = Description.heightForWidth(Description.width());
   Description.setMaximumHeight(newHeight);
   QWidget::resizeEvent(evt); 
   // Note: I'm not sure if this last step is necessary
}

需要注意的一个有趣的项目是,如果您同时使用setMinimumHeight(newHeight)setMaximumHeight(newHeight),标签将垂直增长以适应文本,但当标签水平增长并且不需要额外空间时它永远不会缩小。我的猜测是heightForWidth(int w) 返回小部件的 minimumHeight 和实际需要的像素之间的最大值。奇怪的是,它似乎并不关心返回大于当前 maximumHeight 的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多