軟件界面的風格變化可以通過兩種機制完成,一種是通過設置主題(Themes),它使用 界面庫本身所具有的對界面組件(Components)的控制能力切換顯示風格;另外一種是 通過提供不同系列的圖片來切換顯示界面,即這裡所講的 Skin。
制作表皮有幾個重要的因素值得考慮:
1. 使用無邊界的窗口
在 XWindow 下,無邊界的窗口是指不受窗口管理器管理的邊界不規則的窗口。由於 不受窗口管理器管理管理,所以軟件窗口界面沒有附加的標題條(Title Bar)等。 在Qt中,建立無邊界窗口的最簡單的方法 是設置 QWidget 的 WFlags 的值是 WStyle_NoBorder。它定義在 qnamespace.h 中。 不規則窗口的特點則要求對整個 窗口使用圖像掩碼。使用 X 窗口形狀的擴展(X Shape Extension)來達到要求。在 Qt 中可以直接使用,
QBitmap bm;
bm = *(Pixmaps[MASK]);
setMask(bm);
setBackgroundPixmap(*Pixmaps[BACKGROUND]);
2. 窗口的移動
由於上述窗口不受窗口管理器的管理的特性,所以移動窗口需要特殊處理,一般的 方法是截取根Widget的鼠標按鈕事件,自己處理鼠標點擊和移動的事件。void SkinDemo::mouseMoveEvent(QMouseEvent *e)
{
QPoint newpos = e->globalPos();
QPoint upleft = pos0 + newpos - last;
move(upleft);
}
void SkinDemo::mousePressEvent(QMouseEvent *e)
{
last = e->globalPos();
pos0 = e->globalPos() - e->pos();
}
這裡我們取得的鼠標位置是絕對位置,即相對於根窗口的位置,同時也記錄下窗口 左上角的位置,當鼠標移動時,取得新的絕對位置,則窗口左上角 的新位置應該 是原來位置與鼠標移動的位置之差。
3. 按鈕的制作
對於表皮中的圖像按鈕,設置它的父類是 QButton,這種按鈕由兩幅圖片構成,一幅圖片是正常狀態(Normal),一幅圖片是按鈕按下時的狀態(Activated)。有時 也可以設置成四種狀態,即增加禁止狀態(Disabled)和鼠標指針進入時的狀態 (Hovered)。
在例子(qt-skin-example.tar.gz)中,我們重新定義了鼠標按下和鼠標移動的事件處理 函數,並且含有按鈕的所有信息,主工作區的所有信息等。主工作區的信息是它的 位置和尺寸,主窗口的信息是它所使用的背景圖片和圖片的掩碼(用來制造不規則窗 口),所以整個主窗口的大小可以由圖片的尺寸來決定。幾個按鈕的信息包含它們的 位置,它們的大小由圖片的大小來決定。
下面是程序運行結果之一: