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