Qt 在QFont中查找文本宽度

Qt 在QFont中查找文本宽度,qt,qtreeview,qfontmetrics,Qt,Qtreeview,Qfontmetrics,我的树模型中有两个项目我的文本对齐方式有点差异。这是由文本的宽度引起的,但我使用QFontMetrics::width()检查了文本的宽度,但两个文本都相同 Text1:111601756 text 2:9999999 6 从图像中可以看出,第二个文本中存在轻微的对齐问题 以下是我尝试的示例代码:- QFont font("times",24); QFontMetrics metrics(font); qDebug() << "Width 1"

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

Text1:111601756
text 2:9999999 6

从图像中可以看出,第二个文本中存在轻微的对齐问题

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

QFont font("times",24);
QFontMetrics metrics(font);
qDebug() << "Width 1" <<      metrics.width(QString::number(111111111));
qDebug() << "Width 2" << metrics.width(QString::number(999999999));
现在的问题是绘制发生在错误的区域,因为从图像中可以看到数据绘制在根项的顶部。任何我在这里遗漏的线索

新产出:


这里有一个部分答案,一部分是猜测:

宽度正确(适用于该字体)。问题似乎是,QTreeView不使用该宽度,而是使用边界矩形的宽度(这是我的猜测,不是100%确定)。要查看宽度的差异,请尝试此版本的测试代码:

QFont font("times",24);
QFontMetrics metrics(font);
qDebug() << "Rect 1" << metrics.boundingRect(QString::number(111111111));
qDebug() << "Rect 2" << metrics.boundingRect(QString::number(999999999));
请注意,如果现在居中,您可能还需要调整绘制对齐方式,因为您可能需要左对齐文本

请注意,此修复程序假定所有数字字符的字体宽度相同(我认为这适用于大多数字体,因为否则数字将很难读取),并且数字的位数相同。如果不是,您可以尝试以下方法,以使所有项目的宽度相等:

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

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

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

  • 时代
  • 信使
  • 信使新

  • 感谢海德,这是一个很好的解释,我试着从我的提示,但问题仍然存在。我已经编辑了我的问题。@anbuselvan在答案中添加了新的部分!感谢您更新的解决方案,我已经更新了我的问题。
    QFontMetrics.horizontalAdvance
    提供以像素为单位的宽度,而不会与矩形混淆。
    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