2017-01-17 99 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; }" 
    ); 

我在Qt的樣式表中使用border-image代替background-image由於a deficiency

如何使用樣式表中的圖像更平滑地縮放?

使用pixmaps實現相同的功能要少得多。我必須總是捕捉調整大小的事件,重新計算我所有小部件的新大小,並手動重新繪製它們。

編輯:

有趣的是,平滑縮放與樣式表工作,如果該圖像被放大時,而不是當它被收縮。

在以下示例中,第一行使用32 * 32圖標,第二行使用大於2000 * 2000的均勻網格。

example

+1

我舉了一個例子:[example](http://i.imgur.com/Qz79kXP.png)。 左邊是你的QPushButton StyleSheet方法。中間是帶有_SmoothTransformation_的QPixmap,右邊是帶有_FastTransformation_的另一個QPixmap。 原始箭頭圖像是一個128x128圖像。就我所看到的例子而言,您的方法似乎在圖像中具有平滑的縮放比例。也許我錯過了一些東西。 – jgorosdev

+0

@jgorosdev:有趣的是,放大圖像時使用平滑縮放,但在縮小圖像時不使用平滑縮放。 – vsz

回答

1

內部,Qt使用QPainter繪製風格,並QPainter使用繪圖縮放像素圖時,雙線性插值。當降尺寸因子足夠小時,從質量角度來看,這具有主要缺點,例如參見this bug report。爲獲得最佳質量,背景源圖像應始終位於目標大小的[0.5,2.0]因子範圍內。 AFAICT沒有簡單的辦法擺脫這個限制。