2017-01-17 8 views
8

デフォルトでは、Qtは非常にシンプルで素早く醜い画像スケーリングの方法を使用しています。Qt::FastTransformation、おそらく最近隣の補間または非常に似たものです。Qtスタイルで背景画像をスムーズに縮小する方法は?

QPixmapを扱う場合、1は、例えば、ただし

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

を視覚的に優れたスケーリングを選択することができ、画像がQPixmapオブジェクトではなく、単にAの背景場合、我々は何を行うことができますボタン、または他のウィジェット?

たとえば、レイアウトと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; }" 
    ); 

私が原因のQtスタイルシートでa deficiencyborder-image代わりのbackground-imageを使用。

スタイルシートで使用されている画像で、よりスムーズなスケーリングを行うにはどうすればよいですか?

pixmapsで同じことを実装することははるかに優雅ではありません。私はいつもサイズ変更イベントをキャッチし、すべての私のウィジェットの新しいサイズを再計算し、それらを手動で再描画する必要があります。

編集:画像を拡大している場合は、それを縮めているではないとき

は興味深いことに、スムーズなスケーリングは、スタイルシートで動作します

次の例では、最初の行に32 * 32のアイコンが使用され、2番目の行には2000 * 2000より大きい均一なグリッドが使用されています。

example

+1

私は例を挙げました:[例](http://i.imgur.com/Qz79kXP.png)。 左のものがQPushButtonスタイルシートのアプローチです。真ん中は_SmoothTransformation_を持つQPixmapで、右は_FastTransformation_を持つ別のQPixmapです。 元の矢印イメージは128x128イメージです。私の例で見る限り、あなたのアプローチはイメージのなめらかなスケーリングを持つようです。たぶん私は何かを見逃しています。 – jgorosdev

+0

@jgorosdev:興味深いことに、スムーズなスケーリングはイメージを拡大するときに使用されますが、イメージを小さくするときは使用されません。 – vsz

答えて

1

内部的には、Qtはスタイルを描画するためにQPainterを使用して、スケーリングされたピックスマップを描画するときQPainterは、双線形補間を使用しています。これは、ダウンスケーリング係数が十分に小さい場合の品質の観点から、例えば、this bug reportを参照すると、大きな欠点があります。最良の品質を得るためには、バックグラウンドソースイメージは常に目標サイズの[0.5、2.0]ファクタ内になければなりません。 AFAICTでは、この制限から容易な方法はありません。

関連する問題