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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QPainter, drawText и текстуры  (Прочитано 7404 раз)
алексей
Гость
« : Май 25, 2012, 10:17 »

Здравствуйте ! Необходимо выводить текст с использованием текстуры (png файлы).
Есть paintEvent с таким содержанием:

Код:
void test::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);

QFont font;
int fontHeight = height()*0.7;
font.setPixelSize(fontHeight);
painter.setFont(font);

QPen pen;
//pen.setBrush(QBrush(QPixmap("c:\\test.png").scaled(rect().size())));
pen.setBrush(QBrush(QPixmap("c:\\test1.png").scaled(rect().size())));
painter.setPen(pen);
painter.drawText(rect(), Qt::AlignCenter, "test");
}

Если используется test.png (одноцветная заливка) - отображается нормально, если test1.png (градиент) - по нижнему краю букв идет полоска.
В чем может быть дело ??
Заранее спасибо за ответы, текстуры во вложении...
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Май 25, 2012, 10:26 »

Код:
	int fontHeight = height()*0.7;
Интересно, что Вы пытались получить от этого?
И чем не устроил
Код
C++ (Qt)
QBrush::QBrush ( const QGradient & gradient )
?
Записан

Qt 5.11/4.8.7 (X11/Win)
алексей
Гость
« Ответ #2 : Май 25, 2012, 11:01 »

int fontHeight = height()*0.7; - в данном случае особо ничего - просто кусочек из проекта в котором нужна зависимость размера шрифта от размера окошка и текстурированный текст. Градиентная заливка - устраивает всем, приведенный png файлик  с градиентом только пример, на самом деле будут использоваться не только градиенты....может надо как-то по другому масштабировать png Непонимающий
« Последнее редактирование: Май 25, 2012, 11:06 от алексей » Записан
ammaximus
Гость
« Ответ #3 : Май 25, 2012, 15:21 »

Попробуйте такой вариант
Код:
pen.setBrush(QBrush(QPixmap("c:\\test1.png").scaled(rect().size(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation)));
Только мне кажется оно того не стоит. Отказываться от быстрого преобразования из-за того что в масштабе 3х начинает квадратить градиент. Масштабирование градиентов всегда сложная задача, попробуйте создать градиент в фотошоп 30х30 и приблизить до 3000х. А это таки профессиональное приложение.
Делайте градиенты динамически, как предложил GreatSnake.
Другие изображения, без таких требований к плавности перехода scaled съедает нормально.
Еще могу посоветовать делать текстуры больше в сторону именно градиентости. Больше пикселей - больше информации для алгоритма растягивания, не забывайте. Попробуйте сделать такую же текстурку, но шириной в 1 пиксель, а высотой в 300. Весит 300 байт, а даже моих 1900х1200 не хватило чтобы расквадратить
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #4 : Май 25, 2012, 15:27 »

Мало того, загрузка картинки, создание тяжелого QPixmap-а и последующий его ресайс в отрисовке ...
За такие дела надо сильно по рукам давать )
Записан

Qt 5.11/4.8.7 (X11/Win)
алексей
Гость
« Ответ #5 : Май 30, 2012, 07:55 »

Попробуйте такой вариант
Код:
pen.setBrush(QBrush(QPixmap("c:\\test1.png").scaled(rect().size(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation)));
Только мне кажется оно того не стоит. Отказываться от быстрого преобразования из-за того что в масштабе 3х начинает квадратить градиент. Масштабирование градиентов всегда сложная задача, попробуйте создать градиент в фотошоп 30х30 и приблизить до 3000х. А это таки профессиональное приложение.
Делайте градиенты динамически, как предложил GreatSnake.
Другие изображения, без таких требований к плавности перехода scaled съедает нормально.
Еще могу посоветовать делать текстуры больше в сторону именно градиентости. Больше пикселей - больше информации для алгоритма растягивания, не забывайте. Попробуйте сделать такую же текстурку, но шириной в 1 пиксель, а высотой в 300. Весит 300 байт, а даже моих 1900х1200 не хватило чтобы расквадратить

Спасибо !!! попробую !
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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