Найти ширину текста в QFont

У меня есть два элемента в моей модели дерева. У меня небольшая разница в выравнивании текста. Это вызвано шириной текста, но я проверил ширину текста с помощью QFontMetrics::width(), но оба текста одинаковы.

Текст1 111601756
Text2: 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);
}

Теперь проблема в том, что рисование происходит не в той области, поскольку на изображении видно, что данные нарисованы в верхней части корневого элемента. Любая подсказка, что мне здесь не хватает.

Новый вывод:

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

Это должно показать, что первый прямоугольник менее широк. Это потому, что, хотя расстояние между символами одинаково, 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

Вот ответ, предоставленный моим другом в другом блоге. Проблема здесь заключается в семействе шрифтов, например, здесь семейство шрифтов MS Shell Dlg 2, которое использует пространство, доступное в тексте, например, 1, уже, чем 9, поэтому оно использует это пространство. и, таким образом, приводит к проблеме выравнивания, но есть семейство шрифтов, которое использует фиксированную ширину. Так что хитрость здесь заключается в том, чтобы изменить семейство шрифтов, которое использует фиксированную ширину, чтобы избежать этой проблемы.

Для примера ниже приведены некоторые семейства, которые используют фиксированную ширину:

  1. раз
  2. курьер
  3. Новый Курьер
Другие вопросы по тегам