2017-01-17 3 views
8

По умолчанию Qt использует очень простой, быстрый и уродливый способ масштабирования изображений, Qt::FastTransformation, возможно, ближайшую соседнюю интерполяцию или что-то очень похожее.Как выполнить плавное масштабирование фоновых изображений в стилях Qt?

Когда имеешь дело с QPixmap, можно выбрать визуально лучше масштабирование, например,

pixmap = pixmap.scaledToHeight(height, Qt::SmoothTransformation); 

Однако то, что мы можем сделать, если изображение не в QPixmap объекта, а просто фоне или какой-либо другой виджет?

Например, это очень простой способ создания автоматической настройки размера, полностью настраиваемой кнопки, хорошо подходящей для приложения, не зависящего от разрешения, при использовании с макетами и setStretch().

ui->pushButton->setStyleSheet(
    "QPushButton { border-image: url(:/img/button.png) 0 0 0 0 stretch stretch; }" 
    "QPushButton:checked { border-image: url(:/img/button_checked.png) 0 0 0 0 stretch stretch; }" 
    "QPushButton:pressed { border-image: url(:/img/button_pressed.png) 0 0 0 0 stretch stretch; }" 
    "QPushButton:checked:pressed { border-image: url(:/img/button_checked_pressed.png) 0 0 0 0 stretch stretch; }" 
    ); 

Я использовал border-image вместо background-image благодаря a deficiency в таблицах стилей Qt.

Как можно добиться более плавного масштабирования изображений, используемых в таблицах стилей?

Реализация одного и того же с pixmaps гораздо менее изящна. Я должен всегда перехватывать события изменения размера, пересчитывать новые размеры всех моих виджетов и перерисовывать их вручную.

Edit:

Интересно, что плавное масштабирование работает с таблицами стилей, если изображение расширяется, но не тогда, когда он усаживается.

В следующем примере в первой строке используется значок 32 * 32, а во второй строке - единая сетка размером более 2000 * 2000.

example

+1

Я привел пример: [пример] (http://i.imgur.com/Qz79kXP.png). Левый - это ваш подход QPushButton StyleSheet. Середина - это QPixmap с _SmoothTransformation_, а правый - другой QPixmap с _FastTransformation_. Исходное изображение стрелки - изображение 128x128. Насколько я вижу в моем примере, ваш подход, похоже, имеет плавное масштабирование изображений. Может быть, я чего-то не хватает. – jgorosdev

+0

@jgorosdev: Интересно, что гладкое масштабирование используется при увеличении изображения, но не при уменьшении его размера. – vsz

ответ

1

Внутри Qt использует QPainter рисовать стили и QPainter использует билинейной интерполяции, когда рисунок масштабируется растров. Это имеет существенный недостаток в отношении качества, когда коэффициент масштабирования достаточно мал, например, this bug report. Для лучшего качества исходное исходное изображение всегда должно находиться в пределах [0,5, 2,0] коэффициента целевого размера. AFAICT нет простого выхода из этого ограничения.

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