首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在QFont中查找文本宽度

在QFont中查找文本宽度
EN

Stack Overflow用户
提问于 2016-08-17 11:15:15
回答 2查看 1.6K关注 0票数 2

在我的树模型中有两个项,我在文本alignment.Is中有很小的差异,这是由于文本的宽度造成的,但是我使用QFontMetrics:: width ()检查了文本的宽度,但是两个文本都是相同的。

Text1 1:111601756

Text2 2:999999996

从图像中可以看到,在第二个文本中有一个轻微的对齐问题。

下面是我尝试过的示例代码:-

代码语言:javascript
复制
QFont font("times",24);
QFontMetrics metrics(font);
qDebug() << "Width 1" <<      metrics.width(QString::number(111111111));
qDebug() << "Width 2" << metrics.width(QString::number(999999999));

输出:

宽度1 153 宽度2 153

MyDelegate油漆功能:-

代码语言:javascript
复制
void LiDefaultTreeDelegate::paint(QPainter *painter, const    
QStyleOptionViewItem &option, const QModelIndex &index) const
{
QStyleOptionViewItem newOption = option;
if(index.data(Qt::DisplayRole).toString() != NULL)
 {

    QString text = index.data(Qt::DisplayRole).toString();

    QFontMetrics fnMetrics(fn);
    newOption.rect = fnMetrics.boundingRect(text);
    //Case 1
    //newOption.rect.setWidth(fnMetrics.width(text));
    //Case 2
    //newOption.rect.setWidth(fnMetrics.width('0') * option.rect.width());
 }
  QStyledItemDelegate::paint(painter, newOption, index);
}

现在的问题是,绘制发生在错误的区域,因为从图像中可以看到数据被绘制在根项的顶部。知道我在这里错过了什么吗。

新产出:

EN

回答 2

Stack Overflow用户

发布于 2016-08-17 12:11:01

这里有一个部分答案,也有部分推测:

宽度(对于那种字体)是正确的。问题似乎是,QTreeView没有使用那个宽度,而是使用了边框的宽度(这是我的猜测,不是100%肯定的)。若要查看宽度的差异,请尝试测试代码的以下版本:

代码语言:javascript
复制
QFont font("times",24);
QFontMetrics metrics(font);
qDebug() << "Rect 1" << metrics.boundingRect(QString::number(111111111));
qDebug() << "Rect 2" << metrics.boundingRect(QString::number(999999999));

它应该表明,第一个区域的宽度较小。这是因为尽管字符间距相同,但1实际上比9更窄,所以字符串的左边和右边有更多的空空间。边框不包含这个空空间,它报告显示所绘制的所有内容的最小矩形。

因此,您需要查看绘制模型项的委托,问题就在这里!如果其他一切都失败了,您可能必须实现自己的委托才能正确绘制。

建议对下面问题中所示的代码进行修正:

代码语言:javascript
复制
newOption.rect = fnMetrics.boundingRect(text); // existing line
newOption.rect.setWidth(fnMetrics.width(text)); // add width adjustment

请注意,如果它现在是居中的,您可能还需要调整绘画的对齐方式,因为您可能需要左对齐的文本。

注意,这个修复假设字体对所有数字字符都具有相同的宽度(我认为大多数字体都是这样,因为否则数字将很难读懂),并且数字具有相同的数字。如果不是,您可以尝试这样的方法,以获得所有项的相同宽度:

代码语言:javascript
复制
newOption.rect.setWidth(fnMetrics.width('0') * desiredColumnWidth); // width adjustment
票数 2
EN

Stack Overflow用户

发布于 2016-08-18 09:06:12

这是我朋友在其他blog.The问题中提供的答案,这里是字体族,例如,字体族是MS Shell Dlg 2,它使用文本中可用的空间,比如1比9小,所以它使用这个空间,从而导致对齐问题,但是有字体家族使用固定的width.So,这里的诀窍是改变使用固定宽度的字体系列来避免这个问题。

例如,以下是一些使用固定宽度的家庭:

  1. 《时代》
  2. 快递员
  3. 信使新
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38995089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档