2013-06-07 2 views
2

Я новичок в Qt, и я пытаюсь сделать некоторые QPainter рисунок с помощью следующего кода теста:Qt5 QPainter псевдонимов рисунка правила с

QPixmap pixmap(20, 20); 
pixmap.fill(Qt::white); 
QPainter painter(&pixmap); 

// Draw a rectangle (works fine in both Qt4 and Qt5) 
painter.setPen(Qt::blue); 
painter.drawLine(0, 0, 10, 0); 
painter.drawLine(0, 0, 0, 10); 
painter.drawLine(10, 0, 10, 10); 
painter.drawLine(0, 10, 10, 10); 

// Draw an example line from official docs (broken in Qt5) 
painter.setPen(Qt::darkGreen); 
painter.drawLine(2, 7, 6, 1); 

// Draw an X (broken in Qt5) 
painter.drawLine(13, 13, 18, 18); 
painter.drawLine(13, 18, 18, 13); 

Так или иначе, Qt4 (4.8.4) и Qt5 (5.0.1 , 5.0.2) дают мне совершенно разные results.

Это не похоже, что Qt5 следует за rules described in its own official docs. Однако есть новый подсказку рендера QPainter::Qt4CompatiblePainting. Если я его установлю, это действительно даст мне тот же результат, что и в Qt4.

Так что мои вопросы:

  • Каковы новые правила живописи на самом деле?
  • Где находится документация для этих новых правил?
  • Почему «X» в нижней правой части моего изображения не симметричен в Qt5?
+0

Только ссылки я знаю, [это отчет об ошибке] (HTTPS: //bugreports.qt-project.org/browse/QTBUG-27500) и [связанная фиксация] (https://github.com/qtproject/qtbase/commit/7b8e10ddd02693b3d6b7a7e74d2103787f6e76ac), которая имеет немного объяснений. Документы кажутся все еще неправильными, поэтому, поэтому стоит открыть отчет об ошибках на этих страницах. – peppe

ответ

1

Так я открыл bug на Qt трекера и получил следующий ответ Гуннара Sletta:

Это правильно, что правила растеризации были улучшены и сделаны последовательны в Qt 5. В настоящее время они соответствуют как визуализировать сглаженную графику (которая всегда была правильной). Псевдонимая графика всегда была по-разному в Qt 4, что вызвало всевозможные проблемы. Соответствующие документы должны быть соответствующим образом обновлены. Вся логика нижнего правого смещения применяется только к режиму совместимости Qt4.

Стиль крышки по умолчанию (как мы рисуем конечные точки) для QPen Qt :: SquareCap. Это означает, что линия становится на половину пикселя длиннее в каждом направлении, и составляет один пиксель, который приземляется внизу. Установите стиль крышки на FlatCap, и дополнительный пиксель уйдет, как следует.

Мои дальнейшие эксперименты показывают, что просто установить стиль пера на Qt::FlatCap недостаточно - он все еще оставляет некоторые проблемы (другого рода). Правильный способ получения результатов, таких как Qt4 без флага совместимости, теперь используется с использованием координат с плавающей запятой вместо целого числа и добавления 0,5 ко всем конечным точкам (без, определяющих стиль линии Qt::FlatCap). Например:

painter.setPen(Qt::darkGreen); 
painter.drawLine(QPointF(2.5, 7.5), QPointF(6.5, 1.5)); 

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

painter.translate(0.5, 0.5); 

 Смежные вопросы

  • Нет связанных вопросов^_^