【问题标题】:Find the text width in QFont在 QFont 中查找文本宽度
【发布时间】:2016-08-17 11:15:15
【问题描述】:

我的树模型中有两个项目,我的文本对齐方式差异很小。这是由文本的宽度引起的,但我使用 QFontMetrics::width() 检查了文本的宽度,但两个文本都相同。

文本1:111601756
文本2:999999996

从图片可以看出,第二个文本有轻微的对齐问题。

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

QFont font("times",24);
QFontMetrics metrics(font);
qDebug() << "Width 1" <<      metrics.width(QString::number(111111111));
qDebug() << "Width 2" << metrics.width(QString::number(999999999));

输出:

宽度 1153

宽度 2 153

MyDelegate 绘制函数:-

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);
}

现在问题是绘制发生在错误的区域,因为从图像中您可以看到数据被绘制在根项的顶部。任何线索我在这里缺少什么。

新输出:

【问题讨论】:

    标签: qt qtreeview qfontmetrics


    【解决方案1】:

    这是一个部分答案,部分是推测:

    宽度正确(对于该字体)。问题似乎是,QTreeView 不使用 that 宽度,它使用 bounding rect 的宽度(这是我的猜测,不是 100% 确定的)。要查看宽度差异,请尝试此版本的测试代码:

    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 更窄,因此字符串的左右两侧有更多的空白空间。并且边界矩形不包括这个空白空间,它报告显示所有绘制的最小矩形。

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


    对问题中现在显示的代码的建议修复:

    newOption.rect = fnMetrics.boundingRect(text); // existing line
    newOption.rect.setWidth(fnMetrics.width(text)); // add width adjustment
    

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

    注意,此修复假定字体对于所有数字字符具有相同的宽度(我认为这适用于大多数字体,因为否则数字将难以阅读),并且数字具有相同的位数。如果没有,您可以尝试这样的方法,以获得所有项目的相同宽度:

    newOption.rect.setWidth(fnMetrics.width('0') * desiredColumnWidth); // width adjustment
    

    【讨论】:

    • 感谢 hyde,这是我从提示中尝试过的一个很好的解释,但问题仍然存在。我已经编辑了我的问题。
    • @anbuselvan 为答案添加了新部分!
    • 感谢您更新的解决方案,我已经更新了我的问题。
    • QFontMetrics.horizontalAdvance 为您提供以像素为单位的宽度,而不会乱用矩形。
    【解决方案2】:

    这是我朋友在其他博客中提供的答案。这里的问题是字体系列,例如这里的字体系列是 MS Shell Dlg 2,它使用文本中的可用空间,比如 1 比 9 更窄,所以它使用该空间并因此导致对齐问题,但有使用固定宽度的字体系列。所以这里的技巧是更改使用固定宽度的字体系列以避免这个问题。

    例如以下是一些使用固定宽度的系列:-

    1. 时代
    2. 快递
    3. 新快递

    【讨论】:

      猜你喜欢
      • 2012-03-13
      • 2011-07-07
      • 2020-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多