QPainter :: rotate отключает сглаживание нарисованного текста - PullRequest
8 голосов
/ 03 ноября 2011

Я использую QPainter::setRenderHint(QPainter::Antialiasing, true), чтобы сообщить Qt, что я хочу сглаживать любой чертеж, который я делаю (в данном случае текст рисуется с drawText()).

Это прекрасно работает, и текст выглядит хорошо, пока я не хочу повернуть растровое изображение, которое я рисую, например,

Painter.translate(0, height());
Painter.rotate(-90);

(чтобы повернуть QPainter на 90 градусов против часовой стрелки и вернуть его на место)

Вызов rotate(), кажется, отключает сглаживание для любого нарисованного текста - текст рисуется с правильным вращением, но без сглаживания. Другие вещи кажутся незатронутыми - например, drawLine() все еще рисует хорошо сглаженную линию.

Есть идеи, что я делаю не так?

РЕДАКТИРОВАТЬ: Неудивительно, что добавление текста к пути, а затем заполнение этого пути дает мне сглаженный, вращаемый текст. Я бы предпочел избежать этого маршрута, если это возможно.

РЕДАКТИРОВАТЬ (снова): я пытался использовать QFont::setStyleStrategy(QFont::PreferAntialias) на шрифте, который я использую, без эффекта. Тем не менее, еще несколько экспериментов показывают, что базовый шрифт, такой как Arial, по-прежнему будет генерировать сглаженный текст при повороте, тогда как мой собственный шрифт (Swiss721 BlkCn BT для всех, кто интересуется) не будет. Более того, хотя эта проблема существует в Windows 7, у меня нет такой же проблемы при работе в Ubuntu. Эта статья FAQ , по-видимому, предполагает, что Qt обращается к хост-операционной системе для обработки сглаживания шрифтов, поэтому, какие проблемы могут возникнуть у Windows при обработке рендеринга этого конкретного шрифта (который является TrueType, так же, как Arial) )

РЕДАКТИРОВАТЬ (в прошлый раз, я обещаю): Увеличение размера шрифта до 16pt или выше убивает проблему. Казалось бы, проблема в том, что мой конкретный шрифт ниже 16pt, возможно, что-то связанное с тем, что было упомянуто в статье блога выше:

В Windows 2000 шрифты обычно не сглаживаются в определенном диапазоне (скажем, размеры 8-16), чтобы сделать текст более четким и читабельным.

Ответы [ 2 ]

4 голосов
/ 03 ноября 2011

Недавно мне довелось побывать в этой части кода Qt, и я думаю, что поведение, которое вы видите, связано со следующими двумя ошибками в Qt:

Если я правильно помню (не на 100%), что вы на самом деле видите потерю рендеринга ClearType в Windows. Когда применяется преобразование, Qt получает пиксели глифа таким образом, что выбрасывает информацию ClearType, поэтому вещи выглядят более неровно.

Если вы хотите посмотреть код самостоятельно, наиболее вероятное место - /src/gui/text/qfontengine_win.cpp. Вы также можете попробовать отключить ClearType и посмотреть, похожи ли они.

0 голосов
/ 03 ноября 2011

Одно «предположение» касается вашего RenderHint. Вы используете QPainter::Antialiasing здесь. Документ: «Указывает, что движок должен сгладить края примитивов , если это возможно». Примитивы, такие как линии, линии и т. Д. Вместо этого попробуйте QPainter::TextAntialiasing.

Примечание: RenderHints - это флаги, так что вы можете при необходимости использовать битовые ИЛИ их (и звучит так, как есть).

...