[DTK] QML实现竖向文本的一种思路
Tofloor
poster avatar
sammy-621
deepin
2022-06-16 23:08
Author

要解决的问题

本文为文本的竖向排列提供一种思路和解决方案

版本信息

  • Qt 5.15.2
  • QtQuick 2.0
  • QtQuick.Controls 2.5

用户自定义按钮

在我的应用中有用户自定义的按钮,大概长这样:

按钮有个特性:允许修改文本内容。用户可以通过一个对话框来修改按钮的文本,但其实现不在本文讨论范围。
本文记录了,当用户输入不定长的文本内容时,文字该如何恰当地显示在按钮里。

提供包裹Wrap模式

网上的诸多文章都未讲到如何将文本包裹在QML的形状里。要实现此效果,可以在Text里使用wrapMode。以下是为按钮使用wrapMode的示例:

Button {
  id: playerButton
  implicitWidth: 100
  implicitHeight: 50
  
  contentItem: Text {
      anchors.fill: parent
      text: title
      wrapMode: Text.Wrap
      font.pixelSize: 15
      horizontalAlignment: Text.AlignHCenter
      verticalAlignment: Text.AlignVCenter
  }
}

如上所示,TextwrapMode赋值为Text.Wrap。因为文本是填充到其父级元素(本例为Button)的内部,当文本宽度达到Button的宽度时,将会开始新的一行。这会防止文本越过Button的边界。
看上去很不错,但当文本过长时,它会在顶部或底部越过边界,就象下面这样:

看上去不是很漂亮。

可行的解决方案

我想让文本动态缩放,以使其可以在按钮的四个边界里。
可能以前有人实现过,但我实在没在网上找到过,所以我的方案可视为实验性的,我发现它确实有效。
我们使用TextfontSizeModeminimusPixelSize如下:

Button {
  id: playerButton
  implicitWidth: 100
  implicitHeight: 50
  
  contentItem: Text {
      anchors.fill: parent
      text: title
      wrapMode: Text.Wrap
      fontSizeMode: Text.VerticalFit
      minimumPixelSize: 3
      font.pixelSize: 15
      horizontalAlignment: Text.AlignHCenter
      verticalAlignment: Text.AlignVCenter
  }
}

通过根据文本的总长度来缩放文本的尺寸,以确保文本不出界。当然,文本的长度是有限度的:当文字尺寸小到minimumPixelSize时,再增加文本长度,这个方案就无能为力了。
看下最终效果:

所幸,用户肯定不想输入这么多文本,但如果输入了这些文本,UI界面不会显得太让人崩溃。

中文如何处理

如果想实现类似下图的效果:

只需要将Texttext属性值改为“水\n果”

Reply Favorite View the author
All Replies
诗羔羊
deepin
2022-06-16 23:17
#1

为什么不试试将clip属性设置为true呢?哦,亲爱的楼主,我是说你可以这样试一下。

Reply View the author
心平气和
deepin
2022-06-16 23:19
#2

哦 亲爱的楼主 谢谢你的分享

Reply View the author
sammy-621
deepin
2022-06-16 23:33
#3
诗羔羊

为什么不试试将clip属性设置为true呢?哦,亲爱的楼主,我是说你可以这样试一下。

clip太暴力了,超出的部分直接被切掉了

Reply View the author
Rubbish
deepin
2022-06-17 05:35
#4
sammy-621

clip太暴力了,超出的部分直接被切掉了

elide咋样

Reply View the author
sammy-621
deepin
2022-06-17 19:20
#5
Rubbish

elide咋样

elide解决超长换行场景是挺不错的方案。但解决竖向文本的针对性不强。

Reply View the author