自定義QT窗口部件外觀之QStyle


自定義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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM