【问题标题】:How to draw selectable text with QPainter?如何使用 QPainter 绘制可选文本?
【发布时间】:2016-10-26 19:12:00
【问题描述】:

我需要实现一个像 QGraphcisTextItem 这样的类,但是我需要它是可选择的文本。

但是,如果我的类来自 QGraphicsTextItem 或 QGraphicsItem,并且我重新实现了绘制事件,那么文本可选择的能力就会丢失(我正在使用 drawText)。

所以我的问题是如何使用 QPainter 的 drawText 创建可选择的文本?

【问题讨论】:

  • 您可以在您希望选择的位置绘制不同颜色的文本背景。颜色可以从 QPalette 中挑选。
  • 顺便说一句,你的问题听起来很奇怪。您了解绘图和与用户交互之间的区别吗?你的确切问题是什么?你做过研究吗?
  • 我明白其中的区别。当您使用 QGraphicsTextItem 时,您可以选择文本,然后可以复制它。你有这个名为 setTextSelectable 的特定函数。它甚至启用了用于复制的弹出菜单。我希望自己实现的图形文本项具有相同的功能。我不能使用 QGraphcisTextItem 因为我希望我的项目有不同的字体。我能想到的唯一其他方法是拥有多个文本项,但我不认为这是要走的路。
  • 不确定,但如果你使用QGraphicsTextItem::setHtml(),也许你可以有多种字体,并在html中设置样式(字体)
  • 我也想过这个问题,但是这个解决方案的问题是它是我从资源中添加到 FontDatabse 的字体。我不能使用带有 html 标签的那种添加的字体。

标签: qt qgraphicsitem qpainter


【解决方案1】:

我无法重现您在使用自定义字体时遇到的问题。这是问题中非常重要的一点信息,它大幅度地改变了问题。

addApplicationFont 是一个静态函数,用于将字体添加到应用程序范围的字体数据库中。使用applicationFontFamilies(int id)获取要在html中使用的家庭名称:

...
auto id = QFontDatabase::addApplicationFont(":/fonts/myfont.ttf");
if (if == -1)
  return;
auto families = QFontDatabase::applicationFontFamilies(id);
if (families.isEmpty())
  return;
auto face = families.first().toHtmlEscaped();
auto html = QStringLiteral("<font face=\"%1\">Hello</font>").arg(face);
...

【讨论】:

  • 对不起。一旦你告诉直接尝试它,我已经尝试过它并且它有效并且忘记了检查。非常感谢。我不知道要尝试它,直到我做了你在这里展示的事情并且它的工作让我难以置信。我认为 HTML 标签的字体子集非常有限。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-18
  • 2017-03-21
相关资源
最近更新 更多