【问题标题】:Get Substring of QString by Pixels in Qt cpp在Qt cpp中按像素获取QString的子字符串
【发布时间】:2019-01-13 01:11:30
【问题描述】:

我有一个QString 的像素长度,我可以通过QFontmetrics::width() 获得,我也可以通过QString::length() 获得来自QString 的字符长度,但在这里我打算通过特定的方式切割QString像素数量。

有没有办法通过给出像素大小来获得来自QString 的子字符串?

谢谢!

【问题讨论】:

  • 假设你直接切开一个字母,你应该如何部分显示它?
  • @aconcernedcitizen 我认为由于 OP 想要一个子字符串,部分字符问题超出了范围......在这种情况下,该方法应该超过添加字符的长度,或者可能是最好的方法, 省略它以适应所需的宽度

标签: c++ qt pixel qstring qfontmetrics


【解决方案1】:

是的,您可以使用QFontMetrics::elidedText 这样做。例如,要在 200 像素处剪切,请使用:

QString cutString = yourFontMetrics.elidedText(someString, Qt::ElideNone, 200);

第二个参数表示cut模式(更多值here)。

更新:我不确定这是否是 Qt 中的错误(对我来说是 Qt 5.10.0),但确实 Qt::ElideNone 返回相同的字符串。这里有一个解决方法:

QString cutString(const QString& str, const QFontMetrics& fm, int pixels)
{
  const QChar ellipsis(0x2026);
  if (fm.width(str) <= pixels) return str;
  auto tmpStr = fm.elidedText(str, Qt::ElideRight, pixels + fm.width(ellipsis));
  return tmpStr.left(tmpStr.length() - 1);
}

可以在here 找到一个完整的工作示例(您需要将文件添加到新的 Qt 项目)。

【讨论】:

  • 如果我添加 Qt::ElideLeft 它可以工作,但我希望它没有省略号。谢谢!
  • @karanchavan 很有趣,这似乎是一个错误或与文档的差异。我已经添加了一个解决方法来删除省略号。感谢您指出这一点,我一直使用省略号;)
  • @karanchavan,对不起,我已经更新了代码,从测试中复制了错误的版本
猜你喜欢
  • 2023-01-11
  • 1970-01-01
  • 2020-01-22
  • 2015-10-04
  • 1970-01-01
  • 2014-05-26
  • 1970-01-01
  • 2021-11-25
  • 1970-01-01
相关资源
最近更新 更多