我的树模型中有两个项目我在文本对齐方面有很小的差异。这是由文本的宽度引起的,但是我使用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));
输出:
宽度1 153
宽度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);
}
现在问题是绘画发生在错误的区域,因为从图像可以看出数据被绘制在根项目的顶部。任何线索我在这里失踪了。
新输出:
答案 0 :(得分:2)
这是部分答案,部分推测:
宽度正确(对于该字体)。问题似乎是,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));
它应该表明第一个矩形不太宽。这是因为即使char间距相同,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
答案 1 :(得分:0)
这是我朋友在其他博客中提供的答案。这里的问题是字体系列,例如这里的字体系列是MS Shell Dlg 2,它使用文本中的可用空间,如1比9更窄,所以它使用该空间,从而导致对齐问题,但有使用固定宽度的字体系列。所以这里的技巧是更改使用固定宽度的字体系列,以避免这个问题。
例如,下面是一些使用固定宽度的系列: -