Проблемы выравнивания при рисовании QString на объект QImage - PullRequest
4 голосов
/ 30 октября 2019

Я хочу создать строку, которая будет напечатана на экране. Я буду обновлять эту строку каждый раз, когда значения печатаемых переменных будут меняться. Количество цифр в каждом номере может быть различным, и знак каждого номера может меняться со временем. То, что я хочу быть постоянным, это точность чисел. Вывод, который я ожидаю, выглядит следующим образом (каждая строка соответствует одной и той же строке, только обновлена):

X:  453.432  Y:  543.432
X:   -5.432  Y:    4.432
X:   43.234  Y: -123.423

А именно, буквы и точка всегда должны оставаться на одном и том же месте на экране.

В данный момент я использую этот код для обновления строк, но положение Y и точек меняются, если меняется число цифр. Есть ли простой способ реализовать это?

text = QString("X: %1   Y: %2").arg( QString::number( x(), 'f', 3 ),
                                     QString::number( y(), 'f', 3 ) );

------------------ РЕДАКТИРОВАТЬ ------------------

После ответа я создал строку с постоянным интервалом (фактически, с постоянной длиной). Хотя это не решило мою проблему полностью.

На следующем шаге я беру строку text и, используя QPainter, рисую ее на QImage объекте. Проблема, с которой я здесь сталкиваюсь, заключается в том, что, хотя длина строки всегда одинакова, ширина чисел отличается от ширины пробелов ('') и знака '-', закрашенных QPainter. Поэтому, когда количество цифр меняется, положение точек и символа Y также меняется.

Вот код, который я использую для создания изображения:

QImage img( 100, 100, QImage::Format_ARGB32_Premultiplied ); 
img.fill( Qt::transparent );

QPainter painter( &img );

QPen pen;
pen.setColor( Qt::darkBlue );
painter.setPen(pen);

QFont font = painter.font();
font.setBold( true );
font.setPointSize( 10 );
painter.setFont( font );

QString text = QString("X:%1   Y:%2")
    .arg( x(), 9, 'f', 3, ' ' )
    .arg( y(), 9, 'f', 3, ' ' );
painter.drawText( QPointF(0, 50), text );
painter.end();

1 Ответ

4 голосов
/ 30 октября 2019

Вы можете использовать эту сигнатуру arg метода:

// arg(double a, int fieldWidth, char format, int precision, QChar fillChar)
QString formated = QString("X:%1 Y:%2")
    .arg(x(), 9, 'f', 3, ' ')
    .arg(y(), 9, 'f', 3, ' ');

Для вашей второй проблемы я решаю ее путем изменения семейства шрифтов.

font.setFamily("Courier");

Вот мои результаты:

По умолчанию шрифт:
Default font

Курьер шрифт:
Courier font

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...