QPainter dr aws текст ниже указанного прямоугольника - PullRequest
0 голосов
/ 23 марта 2020

Я заметил странное поведение с использованием класса QPainter. У меня был некоторый рабочий код, использующий drawText:

        painter.drawText(this->m_textArea,
                         Qt::AlignCenter,
                         this->m_text);

После рефакторинга члена m_text, drawText начал рисовать его ниже указанного прямоугольника. Я провел некоторое исследование и выяснил, что у drawText есть проблемы с нулевым завершением пользователя:

TrainEntry::TrainEntry() :
    m_textArea(),
    m_text(TrainEntry::LENGTH + 1, QChar::Null)
{

}

void TrainEntry::setText(const char * text)
{
    for (int i = 0; i < TrainEntry::LENGTH; ++i)
    {
        if ('\0' == *text)
        {
            this->m_text[i] = QChar::Null;
        }
        else
        {
            this->m_text[i] = QChar(*text);
            ++text;
        }
    }
}

Когда я удалил инициализацию +1 размера и заменил QChar::Null на QChar(' '), все в порядке.

Я также проверил документацию и увидел, что QString для строк с указанным размером завершается нулем самостоятельно:

QString гарантирует, что символ в позиции size () всегда равен '\ 0 ', так что вы можете использовать возвращаемое значение data () и constData () в качестве аргументов для функций, которые ожидают строки, завершающиеся на \ 0.

Я специально использовал фиксированную распределенную QString. Может быть, само нуль-терминирование является слишком сильным, но, на мой взгляд, это не должно рассматриваться как ошибка. Кто-нибудь может объяснить, почему это происходит? Я использую версию Qt 4.8.

...