2015-06-30 101 views
2

我想在我的QWidget上使用mask。我想覆蓋現有的小部件按鈕的排 - 類似Skype的如何在QWidget上使用具有透明度的遮罩?

skype buttons

注意,這些按鈕沒有鋸齒狀邊緣 - 他們是很好的平滑且在它們下面部件仍是可見的。 我試圖完成使用Qt樣式表,但是應該被「掩蓋」的像素只是黑色 - 它是黑色矩形背景上的圓形按鈕。
然後我試圖用QWidget :: mask()來做到這一點。我用下面的代碼

QImage alpha_mask(QSize(50, 50), QImage::Format_ARGB32); 
alpha_mask.fill(Qt::transparent); 

QPainter painter(&alpha_mask); 
painter.setBrush(Qt::black); 
painter.setRenderHint(QPainter::Antialiasing);  
painter.drawEllipse(QPoint(25,25), 24, 24); 

QPixmap mask = QPixmap::fromImage(alpha_mask); 
widget.setMask(mask.mask()); 

可悲的是,它會導致以下效果
my buttons
「邊緣」參差不齊,他們應光滑。我保存了生成的掩碼,以便我可以調查是否是問題
enter image description here
它不是。

我知道Linux的Skype版本確實使用Qt,所以應該可以重現。但是如何?

+0

如何使用反鋸齒QPainter繪製圓?面具總是布爾人,你不能與他們抗鋸齒。 – peppe

+0

我這樣做是爲了獲得初始掩碼(查看代碼示例)。 我不能在本機窗口上繪製QWidget,它取決於Qt。 你是說在paintEvent中有空的QWidget和繪圖圈? – wirher

+0

你可以在後臺使用alpha通道的png圖像。 – Milovidov

回答

2

我看到的一種可能的方法如下。

  1. 準備一個很好的高分辨率pixmap與透明背景上的圓形按鈕圖標。

  2. 在正方形小部件上繪製像素圖。

  3. 然後蒙上小部件,留下一點點的邊界超出圓形圖標的邊界,以便小部件蒙版鋸齒不會觸及圖標的平滑邊界。

+0

對於這個問題,這可能是很好的解決方法。感謝您的建議! – wirher

1

我設法得到一個不錯的循環按鈕,沒有太多的代碼。 這裏是我的自定義按鈕的構造函數:

Button::Button(Type t, QWidget *parent) : QPushButton(parent) { 
    setIcon(getIcon(t)); 
    resize(30,30); 
    setMouseTracking(true); 
    // here I apply a centered mask and 2 pixels bigger than the button 
    setMask(QRegion(QRect(-1,-1,32,32),QRegion::Ellipse)); 
} 

,並在樣式表中我有以下幾點:

Button { 
    border-radius: 15px; 
    background-color: rgb(136, 0, 170); 
} 

邊框圓角我得到的視覺圈和麪罩不會損壞邊緣,因爲它距離1個像素。

相關問題