Qt4.2引入了QWidget::setWindowOpacity函數(shù), 可以為窗體設(shè)置透明度, 從0.0到1.0之間, 值越小越透明。 經(jīng)過(guò)設(shè)置的窗體可以整體呈現(xiàn)透明的效果。 但這種設(shè)置比較粗糙, 只能設(shè)一個(gè)整體的效果, 大概只有比如像拖動(dòng)的時(shí)候能用一下, 大多數(shù)時(shí)候都不太實(shí)用。 在Qt4.5里引入了新的窗體透明特性, 是個(gè)Widget的Attribute, 叫做Qt::WA_TranslucentBackground。 這個(gè)屬性可以為每個(gè)QWidget單獨(dú)設(shè)置, 并且透明程度可以用繪制的顏色或圖片的Alpha Channel值來(lái)控制。
筆者寫(xiě)了一個(gè)例子演示其奇妙的效果。 先看一個(gè)截圖:
這個(gè)是筆者例子運(yùn)行出來(lái)的效果, 背景是www.cuteqt.com雷人的主頁(yè)。 下面簡(jiǎn)單介紹一下代碼的實(shí)現(xiàn)。
TranslucentBackground控制窗體透明屬性
例子主界面用QWidget, 其上放置四個(gè)控件, 上面兩個(gè)是自定義的QWidget子類, 用在paintEvent中繪制了一幅透明底色的圖片, 上書(shū)“CuteQt”幾個(gè)大字; 下面兩個(gè)是標(biāo)準(zhǔn)的QLabel控件, 但顯示出兩種不同的效果。
透明的控件的TranslucentBackground屬性為true (繼承了parent的屬性), 而非透明的控件則在代碼中強(qiáng)制將TranslucentBackground設(shè)為了false, 這樣就造就了有意思的結(jié)果。 代碼片段如下:
label = new QLabel(”www.cuteqt.com”);
label->setAttribute(Qt::WA_TranslucentBackground, false);
label->setAutoFillBackground(true);
Alpha Channel控制透明度
將這個(gè)例子稍稍改動(dòng), 修改一下窗體背景色的Alpha值, 使之展現(xiàn)不同的透明度。 實(shí)現(xiàn)的方法是設(shè)置窗體的palette屬性, 為Background這個(gè)ColorRole的顏色設(shè)置了alpha值, 代碼片段如下:
QPalette pal = palette();
pal.setColor(QPalette::Background, QColor(255,0,0,200));
setPalette(pal);
下圖所示為alpha值100和200的不同顯示效果。
怎么樣, 這個(gè)例子挺有意思吧? 趕快下載完整的代碼學(xué)習(xí)一下吧~ 有任何不明白blog或bbs留言~