Russian Qt Forum
Май 15, 2024, 18:49 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Rotated Label  (Прочитано 12748 раз)
kirill
Гость
« : Сентябрь 07, 2009, 09:20 »

Компонента RotatedLabel моего авторства.
Код простейший, может кому понадобится, или может кто улучшит и выложит, с антиалиасом у меня не получилось.
Записан
SABROG
Гость
« Ответ #1 : Сентябрь 09, 2009, 12:29 »

с антиалиасом у меня не получилось.

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



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

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

Разница то есть, но все равно сглаживание далеко от идеального.
Записан
SABROG
Гость
« Ответ #3 : Сентябрь 09, 2009, 12:56 »

Либо я слепой, либо монитор плохой. Еще поигрался с флагами QFont::PreferQuality, QFont::OpenGLCompatible, QPainter::HighQualityAntialiasing

Ну не вижу разницы никакой.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Сентябрь 09, 2009, 13:08 »

Разница то есть, но все равно сглаживание далеко от идеального.
Чтобы гладить - нужно больше данных. Стандартный подход - в буфере создать текст/изображение в масштабе 4x4 (да, в 16 раз больше) и затем его аккуратно уменьшить (самое простое 1 выходной пиксель = среднее значение матрицы 4x4). Делает ли это Qt - не знаю, но похоже что нет (было бы достаточно много написано). А иначе - ну можно как-то тем же бикубиком подгладить, но "квачества" не получить.
Записан
SABROG
Гость
« Ответ #5 : Сентябрь 09, 2009, 13:33 »

В общем исходные данные такие:
Шрифт: Tahoma, 8, 45°

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



Если сравнивать буквы "ro", в Qt оно хотябы просматривается. Скорее всего разница алгоритмов Qt и Excel при повороте текста. При этом флаг QPainter::SmoothPixmapTransform не был выставлен.
« Последнее редактирование: Сентябрь 09, 2009, 13:37 от SABROG » Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #6 : Декабрь 09, 2009, 21:50 »

Вечер добрый, господа))

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

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

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #7 : Декабрь 09, 2009, 23:28 »

Так, нашлась одна бага  Грустный

Подправлена.  Крутой
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
SABROG
Гость
« Ответ #8 : Декабрь 10, 2009, 01:02 »

Интересный подход. В качестве девайса отрисовки виджета используется QPixmap:

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

А сам QPixmap после любых манипуляций уже отрисовывается в любом другом месте. Подход хорош тем, что весь функционал QLabel остается.
Записан
vanessa
Гость
« Ответ #9 : Февраль 08, 2010, 16:38 »

А как его добавить в QT Designer ?
Записан
BRE
Гость
« Ответ #10 : Февраль 08, 2010, 17:13 »

А как его добавить в QT Designer ?
Посмотри в designer на Promote to... (Преобразовать в...)
Записан
vanessa
Гость
« Ответ #11 : Февраль 08, 2010, 18:31 »

Я тут сделал его "по-правильному" заодно и научился делать компоненты для дизайнера.
Записан
vanessa
Гость
« Ответ #12 : Февраль 08, 2010, 21:40 »

Тестировал я эту вещь.
1. пришлось переделать конструктор для класса RotatedLabel
2. обнаружил что при изменении шрифта эти изменения не отображаются на форма, они становятся видны только при переоткрытии формы.

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

что б еще хотелось: чтоб палитра виджета была как у родителя. установка в конструкторе
_label.setPalette(parent->palette());
что-то так вот сходу не помогла отрисовать его с палитрой родителя. или у родителя палитра изменилась уже после  создания виджета
« Последнее редактирование: Февраль 08, 2010, 23:47 от vanessa » Записан
lighting
Гость
« Ответ #13 : Октябрь 03, 2011, 17:03 »

в ходе использования выяснилось что инициализировать пустой строкой "" нежелательно - тогда некорректно возвращаются width() и  height(), они устанавливаются в одно значение и после уже не меняются даже если менять текст и вызывать update и adjustsize. В качестве временного решения инициализирую их пробелом " " тогда все ок.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.072 секунд. Запросов: 22.