自定義QT窗口部件外觀
重新定義Qt內置窗口部件的外觀常用的方法有兩種:一是通過子類化QStyle 類或者預定義的一個樣式,例如QWindowStyle,來定制應用程序的觀感;二是使用Qt樣式表。
QStyle 類的使用
1. 准備必要的背景圖片。在你想添加自定義風格的工程目錄下新建一個文件夾“images”,將背景圖片等放入文件夾“images”。
2. 點擊Qt Creator的“文件”->“新建文件或工程”->模板選擇“Qt”,再選擇Qt資源文件->點擊“選擇”按鈕->輸入名稱->點擊“下一步”->點擊“完成”。
3. 雙擊打開Qt Creator的項目管理器中的“**.qrc”資源文件,單擊“添加”->“添加前綴”,將前綴名“/new/***”更名為“/”->再次單擊“添加”->“添加文件”->將工程目錄下“images”文件夾的圖片添加進來。保存並關閉資源管理器。
4. 下面開始創建樣式子類。新建C++類,命名為myStyle。
5. 修改頭文件“mystyle.h”。頭文件修改好后如下:
#include<QtGui>
#include<QPalette>
#include<QMotifStyle>
classmyStyle:publicQMotifStyle
{
Q_OBJECT
public:
myStyle();
//以下三個函數在裝載Style和卸載Style時調用,它可以是適當修改窗口部件和調色板
voidpolish(QPalette&palette);//改變調色板為樣式指定的顏色調色板
voidpolish(QWidget*widget);//初始化給定窗口部件的外觀,窗口部件每一次創建后首次顯示之前調用
voidunpolish(QWidget*widget);//取消polish()的作用
intpixelMetric(PixelMetricmetric,constQStyleOption*option,
constQWidget*widget)const;//設置各部件的線寬,大小等
intstyleHint(StyleHinthint,constQStyleOption*option,
constQWidget*widget,QStyleHintReturn*returnData)const;//分別設置各種部件的布局,比如checkbox的text在左邊或者在右邊
voiddrawPrimitive(PrimitiveElementelement,constQStyleOption*option,
QPainter*painter,constQWidget*widget)const;
//這個則是最重要的,在這里面可以實現對不同部件的原始元素的繪制,當然你也可以調用默認的方法.element這個參數就是我們需要重繪的部件的原始元素
voiddrawControl(ControlElementelement,constQStyleOption*option,
QPainter*painter,constQWidget*widget)const;
};
我們這里用QMotifStyle類作為基類,當然你也可以采用其他預定義的樣式作為基類。至於選擇哪個基類來繼承完全取決用戶,通常選擇和自己所期望的最相近的類來繼承。這里貼一個圖,主要是繼承層次的圖:
6. 實現文件“mystyle.cpp”的函數定義。
voidmyStyle::polish(QPalette&palette)
{
QColorbrown(212,140,95);//褐色
QColorslightlyOpaqueBlack(0,0,0,63);
QColorveryLightGreen(204,232,215);//淺綠色
QPixmapbackgroundImage(":/images/bgPortrait.jpg");
QPixmapbuttonImage(":/images/wood.jpg");
QPixmapmidImage=buttonImage;//滑動條背景
QPainterpainter;//畫筆
painter.begin(&midImage);
painter.setPen(Qt::NoPen);
painter.fillRect(midImage.rect(),slightlyOpaqueBlack);
painter.end();
palette=QPalette(brown);//調色板
palette.setBrush(QPalette::BrightText,Qt::white);
palette.setBrush(QPalette::Base,veryLightGreen);//設置輸入框背景
palette.setBrush(QPalette::Highlight,Qt::darkGreen);//設置鼠標選中的背景色為深綠色
palette.setBrush(QPalette::Button,buttonImage);//設置按鈕背景
palette.setBrush(QPalette::Mid,midImage);//設置滑動條背景
palette.setBrush(QPalette::Window,backgroundImage);//設置應用程序背景
QBrushbrush=palette.background();
brush.setColor(brush.color().dark());
palette.setBrush(QPalette::Disabled,QPalette::WindowText,brush);
palette.setBrush(QPalette::Disabled,QPalette::Text,brush);
palette.setBrush(QPalette::Disabled,QPalette::ButtonText,brush);
palette.setBrush(QPalette::Disabled,QPalette::Base,brush);
palette.setBrush(QPalette::Disabled,QPalette::Button,brush);
palette.setBrush(QPalette::Disabled,QPalette::Mid,brush);
}
應用程序的顏色外觀主要在這個函數設定,至於可以設置哪些外觀,請參考Qt幫助文檔的 “QPalette::ColorRole”部分。
voidmyStyle::polish(QWidget*widget)
{
if(qobject_cast<QPushButton*>(widget)
||qobject_cast<QComboBox*>(widget))
widget->setAttribute(Qt::WA_Hover,true);
//鼠標進入或者離開窗口部件所在區域時,會產生一個繪制事件
}
voidmyStyle::unpolish(QWidget*widget)
{
if(qobject_cast<QPushButton*>(widget)
||qobject_cast<QComboBox*>(widget))
widget->setAttribute(Qt::WA_Hover,false);
}
intmyStyle::pixelMetric(QStyle::PixelMetricmetric,
constQStyleOption*option,constQWidget*widget)const
{
switch(metric)
{
casePM_ComboBoxFrameWidth:
return6;
casePM_ScrollBarExtent:
returnQMotifStyle::pixelMetric(metric,option,widget)+4;
default:
returnQMotifStyle::pixelMetric(metric,option,widget);
}
}
intmyStyle::styleHint(QStyle::StyleHinthint,
constQStyleOption*option,constQWidget*widget,
QStyleHintReturn*returnData)const
{
switch(hint)
{
caseSH_DitherDisabledText:
returnint(false);
caseSH_EtchDisabledText:
returnint(true);
default:
returnQMotifStyle::styleHint(hint,option,widget,returnData);
}
}
voidmyStyle::drawPrimitive(QStyle::PrimitiveElementelement,
constQStyleOption*option,QPainter*painter,constQWidget*widget)const
{
QMotifStyle::drawPrimitive(element,option,painter,widget);
}
這里采用的是默認的繪制函數,如果要改變PushButton等部件的形狀外觀,請上網查閱相關資料或查閱相關書籍。
voidmyStyle::drawControl(QStyle::ControlElementelement,
constQStyleOption*option,QPainter*painter,constQWidget*widget)const
{
QMotifStyle::drawControl(element,option,painter,widget);
}
這里也是采用默認的繪制函數。
7. 修改“main.cpp”文件。首先添加 #include"mystyle.h"
然后在main函數中添加QApplication::setStyle(newmyStyle);
這樣,自定義樣式的工作就全部完成了。這里只是對QStyle類的使用做了簡單介紹。你也可以參考Qt的Demo例子“styles”。如需詳細了解自定義樣式的相關知識,請訪問網站http://doc.trolltech.com/4.3/style-reference.html
http://blog.csdn.net/liuguangzhou123/article/details/7458450