Russian Qt Forum

Qt => Дополнительные компоненты => Тема начата: kirill от Сентябрь 07, 2009, 09:20



Название: Rotated Label
Отправлено: kirill от Сентябрь 07, 2009, 09:20
Компонента RotatedLabel моего авторства.
Код простейший, может кому понадобится, или может кто улучшит и выложит, с антиалиасом у меня не получилось.


Название: Re: Rotated Label
Отправлено: SABROG от Сентябрь 09, 2009, 12:29
с антиалиасом у меня не получилось.

Имхо вполне ощутимая разница

(http://img190.imageshack.us/img190/1825/antialias.png)

Игра с флагами QPainter::TextAntialiasing, QPainter::SmoothPixmapTransform, QPainter::Antialiasing вообще ничего не дала. А вот font.setStyleStrategy(QFont::PreferAntialias); влияет. Именно этот флаг использует QtCreator в своем редакторе кода.


Название: Re: Rotated Label
Отправлено: kirill от Сентябрь 09, 2009, 12:37
Игра с флагами QPainter::TextAntialiasing, QPainter::SmoothPixmapTransform, QPainter::Antialiasing вообще ничего не дала. А вот font.setStyleStrategy(QFont::PreferAntialias); влияет. Именно этот флаг использует QtCreator в своем редакторе кода.

Разница то есть, но все равно сглаживание далеко от идеального.


Название: Re: Rotated Label
Отправлено: SABROG от Сентябрь 09, 2009, 12:56
Либо я слепой, либо монитор плохой. Еще поигрался с флагами QFont::PreferQuality, QFont::OpenGLCompatible, QPainter::HighQualityAntialiasing

Ну не вижу разницы никакой.


Название: Re: Rotated Label
Отправлено: Igors от Сентябрь 09, 2009, 13:08
Разница то есть, но все равно сглаживание далеко от идеального.
Чтобы гладить - нужно больше данных. Стандартный подход - в буфере создать текст/изображение в масштабе 4x4 (да, в 16 раз больше) и затем его аккуратно уменьшить (самое простое 1 выходной пиксель = среднее значение матрицы 4x4). Делает ли это Qt - не знаю, но похоже что нет (было бы достаточно много написано). А иначе - ну можно как-то тем же бикубиком подгладить, но "квачества" не получить.


Название: Re: Rotated Label
Отправлено: SABROG от Сентябрь 09, 2009, 13:33
В общем исходные данные такие:
Шрифт: Tahoma, 8, 45°

Открыл Excel. Вписал текст в "Эффектах" рабочего стола сначала выбрал сглаживание шрифтов "Обычное", затем "ClearType". Потом отключил сглаживание вообще и посмотрел на результат Qt. Получилось такое:

(http://img38.imageshack.us/img38/7301/antialias2.png)

Если сравнивать буквы "ro", в Qt оно хотябы просматривается. Скорее всего разница алгоритмов Qt и Excel при повороте текста. При этом флаг QPainter::SmoothPixmapTransform не был выставлен.


Название: Re: Rotated Label
Отправлено: m_ax от Декабрь 09, 2009, 21:50
Вечер добрый, господа))

Заинтересовал выш виджеет RotatedLabel, поскольку именно такой крендель нужен в одном проекте...
Выкладываю то что получилось у меня))
Замечу, что проблемы с сглаживанием шрифта полностью отсутствуют, а также, что не маловажно, можно использовать html, как в оригинальном QLabel)) Lf? xnj yt vj;tn yt hfljdfnm))

Snapshot и исходники прилогаются))   


Название: Re: Rotated Label
Отправлено: m_ax от Декабрь 09, 2009, 23:28
Так, нашлась одна бага  :(

Подправлена.  8)


Название: Re: Rotated Label
Отправлено: SABROG от Декабрь 10, 2009, 01:02
Интересный подход. В качестве девайса отрисовки виджета используется QPixmap:

Код
C++ (Qt)
_label.render(&_pixmap);
 

А сам QPixmap после любых манипуляций уже отрисовывается в любом другом месте. Подход хорош тем, что весь функционал QLabel остается.


Название: Re: Rotated Label
Отправлено: vanessa от Февраль 08, 2010, 16:38
А как его добавить в QT Designer ?


Название: Re: Rotated Label
Отправлено: BRE от Февраль 08, 2010, 17:13
А как его добавить в QT Designer ?
Посмотри в designer на Promote to... (Преобразовать в...)


Название: Re: Rotated Label
Отправлено: vanessa от Февраль 08, 2010, 18:31
Я тут сделал его "по-правильному" заодно и научился делать компоненты для дизайнера.


Название: Re: Rotated Label
Отправлено: vanessa от Февраль 08, 2010, 21:40
Тестировал я эту вещь.
1. пришлось переделать конструктор для класса RotatedLabel
2. обнаружил что при изменении шрифта эти изменения не отображаются на форма, они становятся видны только при переоткрытии формы.

патч к архиву - во вложении

что б еще хотелось: чтоб палитра виджета была как у родителя. установка в конструкторе
_label.setPalette(parent->palette());
что-то так вот сходу не помогла отрисовать его с палитрой родителя. или у родителя палитра изменилась уже после  создания виджета


Название: Re: Rotated Label
Отправлено: lighting от Октябрь 03, 2011, 17:03
в ходе использования выяснилось что инициализировать пустой строкой "" нежелательно - тогда некорректно возвращаются width() и  height(), они устанавливаются в одно значение и после уже не меняются даже если менять текст и вызывать update и adjustsize. В качестве временного решения инициализирую их пробелом " " тогда все ок.