Я заметил странное поведение с использованием класса 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.