亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? qianb.txt

?? 本文介紹了如何使用qt提供的接口來設計自己的GUI風格(look and feel)
?? TXT
?? 第 1 頁 / 共 2 頁
字號:
       中國 [ 選擇]      使用條款 
   
 
 
   dW 全部內容-----------------  DB2  Lotus  Tivoli  WebSphere-----------------  Java 技術  Linux  Open source  Security  SOA & Web services  Web architecture  Wireless  XML-----------------IBM 全部內容             
 
 
      首頁       產品       服務與解決方案       支持與下載       個性化服務        
 
 
 
developerWorks 中國 > Linux >    
 
 
 用QT創建新風格Howto    
  
 
 
   
內容: 
 
1.Qt的風格 
 
2.創建新風格 
 
3.使用新風格 
 
4.進一步工作 
 
參考資料  
 
關于作者 
 
對本文的評價 
 
 
 
訂閱: 
 
developerWorks 時事通訊 
 
 
 
 
 
 
級別: 中級
 

姚延棟
研究生, 中國科學院軟件所2002級
2003 年 11 月 

本文介紹了如何使用qt提供的接口來設計自己的GUI風格(look and feel),并通過一個具體的例子(使QSpinBox垂直顯示)來詳細說明過程。運行環境:redhat 9.0,qt-x11-free-3.2.*
1.Qt的風格
a) Qt簡介 
Qt是一個跨平臺的C++圖形用戶界面應用程序開發庫,使用Qt可以開發出高質量的圖形用戶接口,它是完全面向對象的、易于擴展且允許真正的組件編程。 Qt獲得了很大的成功,特別是它的信號-槽機制是非常值得研究的通信機制,它也是Linux發行版標準組件KDE(K Desktop Enviroment)的基礎。 

b) 風格機制 
Qt的風格機制實現了不同平臺上的圖形用戶接口(GUI)的觀感(look and feel),例如Windows平臺上通常使用Windows或Windows-xp風格,而Unix平臺上通常使用Motif、CDE風格。 

下圖顯示了Qt中與風格相關的類的繼承關系


 

QStyle 是所有風格類的基類,它控制著所有的部件(widget即windows編程中的控件)的界面風格或觀感,它定義了大量的枚舉類型和十幾個函數。枚舉類型表示界面上的不同元素(如組合框中的按鈕,按鈕的邊框等);函數控制圖形用戶界面的繪制,但大多數函數基本上只是一些聲明而沒有函數實現,他們的實現在 QCommonStyle、QWindowStyle、QMotifStyle及其子類中。QStyle只實現了3個函數drawItem(), itemRect(), visualRect()。

drawItem(): 負責繪制文本和象素圖。 
itemRect(): 返回文本或圖像所占的區域。 
visualRect(): 返回邏輯坐標,這個函數使Qt實現right-to-left風格(阿文、維文傳統是文本從右向左顯示,因此控件布局也是從右向左)。如下圖所示: 


 

可以看到菜單、工具條是右對齊、單選框的按鈕在右邊

c) 創建新風格的步驟 
在Qt中實現一種新風格的步驟很簡單:只需選擇一個風格類(如QCommonStyle或QStyle)作為父類,然后實現感興趣的函數即可。難點在于函數的實現。 

選擇父類:可以選擇QStyle, QCommonStyle, QWindowStyle, QMotifStyle以及他們的子類的任意一個作為父類。通常可以選擇QWindowsStyle或QMotifStyle,也可以選擇 QCommonStyle甚至是QStyle,但是工作量會比較大,因為很多界面的細節需要自己實現。 

重新實現必要的函數:想修改界面風格的哪部分,就重新實現與繪制那部分相關的函數,下面解釋一下我們要重載的QStyle中的幾個函數,這幾個函數控制著圖形用戶界面上不同元素的布局和觀感。 


                        
1)void drawPrimitive( PrimitiveElement pe,
                    	 QPainter *p,
                        const QRect & r,
                        const QColorGroup & cg,
                        SFlags flags = Style_Default,
                        const QStyleOption &opt = QStyleOption::Default ) ;
                        
 

功能:繪制基本圖形元素,如QSpinBox中的帶箭頭的按鈕 等。 

參數: PrimitiveElement pe: 這個枚舉型變量表示將要繪制的基本圖形界面元素(這里說的基本圖形用戶界面元素指GUI中不可再分的一個原子元素,如組合框 


 

中的這個繪有黑色三角形的按鈕,spinBox中的按鈕 

 


QPainter *p:指向QPainter類的指針,Qt中的所有繪制操作不管是繪制文本、圖形還是圖像都由這個類來處理。 
QRect &r: 表示一個矩形區域,Qt在這個區域中繪制基本界面元素(PrimitiveElement). 
QColorGroup &cg: QColorGroup表示一個部件(widget)的顏色組(color group),color group含有部件繪制自己時使用的各種顏色,譬如前景色背景色等。下圖展示了color group中的各種顏色屬性 

 

SFlags flags: 控制如何繪制圖形界面元素的標志。 
QStyleOption &opt: 繪制不同的部件(widget)時會需要不同的參數,如繪制面板(panel)可能需要線寬作為額外參數而繪制焦點矩形(focus rect)可能需要背景色作為額外參數,所以Qt專門提供了一個類QStyleOption來封裝不同的widget可能需要的不同的參數,opt指向這樣一個類的對象。 


2)void drawComplexControl( 	ComplexControl control,
			QPainter *p,
			const QWidget *widget,
			const QRect &r,
			const QColorGroup &cg,
			SFlags flags = Style_Default,
			SCFlags controls = QStyle::SC_All,
			SCFlags active = QStyle::SC_None,
			const QStyleOption& opt = QStyleOption::Default)
				       			
 

功能:繪制復雜控制部件(widget)如SpinWidget,comboBox,slider,listView等

參數:

ComplexControl control:是一個枚舉量,表示將要繪制的復雜控制部件(widget)如組合框、列表框等。 
QPainter *p:指向QPainter的指針,Qt中的所有繪制操作不管是繪制文本、圖形還是圖像都由這個類來處理。 
QWidget *widget:指向QWdget或其子類的指針,可以根據上面control的值轉變(cast)成合適的類型,例如如果要繪制 QSpinWidget,那么control取值為CC_SpinWidget,而widget指向一個QSpinWidget(QWidget的子類) 的實例(instance)。使用這個變量可以訪問QSpinWidget的成員函數和成員變量,譬如可以調用QSpinWidget的sizeHint 函數獲得這個部件的缺省大?。ㄒ粋€矩形空間)。 
QRect &r: 表示一個矩形區域,Qt在這個區域中繪制控件或其子部件。 
QColorGroup &cg: QColorGroup表示一個部件(widget)的顏色組(color group),color group含有部件繪制自己時使用的各種顏色,譬如前景色背景色等。 
SFlags flags: 控制如何繪制圖形界面元素的標志 
SCFlags controls表示繪制復雜控制部件control的哪個子部件,缺省為SC_All,即繪制整個control而不是其某個子部件(注意control, controls是兩個不同的參數) 
QStyleOption &opt: 在繪制不同的部件時可能需要不同的額外的參數,這個變量在繪制不同的widget時提供不同的信息。 

									
		3) QRect querySubControlMetrics(ComplexControl control,
    								const QWidget* widget,
									SubControl sc,
									const QStyleOption&
									 = QStyleOption::Default)
									
 

功能:獲取子部件的坐標和尺寸信息。這個函數控制著一個復雜控件的布局,重載這個函數可以使的組合框的下拉按鈕繪制在左邊 而不是默認的右邊。

參數: 
ComplexControl control: 枚舉量,表示將要繪制的復雜控制部件(widget)如組合框、列表框等。 
QWidget *widget:指向QWidget或其子類的指針,可以根據上面control的值轉變(cast)成合適的類型,例如如果要繪制 QSpinWidget,那么control取值為CC_SpinWidget,而widget指向一個QSpinWidget(QWidget的子類) 的實例。使用這個變量可以訪問QSpinWidget的成員函數和成員變量,譬如可以調用QSpinWidget的sizeHint函數獲得這個部件的缺省大?。ㄒ粋€矩形空間)。 
SubControl sc:枚舉量,一個復雜部件可能由多個的子部件組成,使用sc變量說明要獲取那個子部件的坐標和尺寸信息。 
QStyleOption &opt: 計算不同部件的尺寸時可能需要不同的額外信息,QStyleOption封裝了這些信息。 

2.創建新風格
下面用一個例子來介紹一下創建新風格的整個過程,在編程之前,先看一下最終的結果是什么樣的。(在Qt內部QSpinBox類是通過QSpinWidget實現的)

默認風格的效果:   使用新風格的效果:   

可以看到在新風格中我們的SpinBox有了垂直顯示的效果。下面我們按上面說明的步驟來創建一種新的風格。

1)選擇基類:我們選擇QWindowsStyle類作為我們新風格類的基類,當然也可以選擇QMotifStyle,在這個例子種也可以選擇 QCommonStyle。一般不建議選擇QCommonStyle作為基類,因為QCommonStyle只實現了一部分界面部件,如果要實現一個完整的風格類,我們需要重新寫很多代碼。

2)重載相關的函數:在這個例程中我們只修改了spinBox的風格,實現這個部件(widget)只與QStyle類的三個函數drawPrimitive, drawComplexControl, qureySubControlMerics相關,所以我們只需重載這三個函數的相關部分代碼.下面對代碼中的關鍵部分做一下注釋,不重要的部分省略了。詳細的代碼可以從后面下載。

繪制spinbox中按鈕的函數:


void CustomStyle::drawPrimitive( PrimitiveElement pe,
                        	QPainter * p,
                            const QRect & r,
                            const QColorGroup & cg,
                            SFlags flags,
                            const QStyleOption & opt ) const
{
/*PE_SpinWidgetUp,PE_SpinWidgetDown表示spinBox中的下按鈕和上按鈕,
下面的代碼使得這兩個按鈕中的三角形分別向左和向右*/
if ((pe == PE_SpinWidgetUp) || (pe == PE_SpinWidgetDown)){
		int fw = pixelMetric( PM_DefaultFrameWidth, 0 );//fw表示邊框寬度,默認為2
		QRect br;  //spinBox上按鈕的邊界矩形不是spinBox的邊界矩形。
		br.setRect( r.x() + fw, r.y() + fw, r.width() - fw*2,
		    r.height() - fw*2 );
		p->fillRect( br, cg.brush( QColorGroup::Button ) );
		int x = r.x(), y = r.y(), w = r.width(), h = r.height();
		int sw = w-4;
		int sh = sw/2 + 2;      // Must have empty row at foot of arrow
		int sx = x + w / 2 - sw / 2 - 1;
		int sy = y + h / 2 - sh / 2 - 1;

		QPointArray a;
/* 設置三角形的三個點的坐標,修改這三個點可以使得QSpinBox上按鈕里的三角型呈現任意的形狀,
下面的設置使得三角形表示的箭頭分別向左和向右。*/
		if ( pe == PE_SpinWidgetDown )
		    a.setPoints( 3,  0, sh/2,  sw-1, 1,  sw-1, sh-1 );
  	else

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产高清不卡一区二区| 久久99在线观看| 欧美国产综合色视频| 欧美成人精品二区三区99精品| 欧美日韩一区二区三区免费看| 91蝌蚪porny成人天涯| 91在线视频播放地址| 91免费在线播放| 日本韩国欧美一区二区三区| 在线一区二区观看| 欧美系列一区二区| 欧美日韩一区二区在线观看视频| 欧美午夜宅男影院| 在线成人高清不卡| 精品美女一区二区| 国产三级精品视频| 亚洲欧美另类久久久精品| 亚洲欧美另类综合偷拍| 性做久久久久久免费观看| 免费三级欧美电影| 国产精品一区二区久激情瑜伽 | 午夜精品久久久久| 天堂精品中文字幕在线| 麻豆中文一区二区| 国产91富婆露脸刺激对白| a级精品国产片在线观看| 在线免费不卡视频| 日韩免费观看2025年上映的电影 | 国产成人自拍高清视频在线免费播放| 韩国成人在线视频| 99riav久久精品riav| 欧美色欧美亚洲另类二区| 欧美一级一区二区| 国产精品毛片久久久久久久| 亚洲国产综合91精品麻豆| 蜜臀久久久99精品久久久久久| 国产精品99久久久久久久vr| 在线观看免费成人| 久久毛片高清国产| 亚洲电影视频在线| 国产精品系列在线观看| 欧美美女网站色| 欧美国产亚洲另类动漫| 日韩专区一卡二卡| 91丨porny丨在线| 精品嫩草影院久久| 亚洲成人黄色影院| www.亚洲免费av| 精品国产一二三| 一区二区三区国产精华| 国产91丝袜在线18| 日韩午夜精品视频| 亚洲成人av一区二区| 成人久久18免费网站麻豆| 日韩欧美第一区| 亚洲国产一区二区在线播放| 国产成人av在线影院| 欧美一区二区啪啪| 亚洲国产一区二区三区| 91色九色蝌蚪| 国产精品欧美综合在线| 黑人巨大精品欧美黑白配亚洲| 欧美在线free| 亚洲免费毛片网站| 成人av在线资源网| 国产女人aaa级久久久级| 捆绑紧缚一区二区三区视频| 欧美猛男超大videosgay| 一区二区欧美国产| 91久久久免费一区二区| 国产精品久久久久久久浪潮网站| 国产精品中文字幕日韩精品| 精品国产91亚洲一区二区三区婷婷| 亚洲18女电影在线观看| 色94色欧美sute亚洲线路二| 亚洲精品高清在线观看| 97se亚洲国产综合自在线| 国产精品国产自产拍高清av | 国产精品污www在线观看| 久久精品国产精品亚洲综合| 91精品国产日韩91久久久久久| 午夜免费欧美电影| 欧美男同性恋视频网站| 日韩高清一区在线| 日韩一区二区三区四区五区六区| 天天色天天爱天天射综合| 欧美精品色综合| 蜜桃视频在线观看一区| 久久只精品国产| 国产成人免费在线观看| 中文字幕一区av| 色av一区二区| 日韩成人一区二区| 精品国产1区二区| 成人亚洲精品久久久久软件| 国产精品国产三级国产专播品爱网 | 国产精品无码永久免费888| 国产mv日韩mv欧美| 亚洲图片激情小说| 欧美美女直播网站| 久草精品在线观看| 亚洲欧洲精品一区二区三区| 欧美性videosxxxxx| 久久成人免费日本黄色| 中文欧美字幕免费| 欧美精品日日鲁夜夜添| 国产伦精品一区二区三区在线观看| 国产清纯在线一区二区www| 欧美主播一区二区三区| 麻豆国产91在线播放| 日韩毛片精品高清免费| 日韩亚洲欧美一区二区三区| 成人免费高清在线观看| 午夜电影一区二区| 中文欧美字幕免费| 日韩欧美在线1卡| 色综合视频在线观看| 久久国产尿小便嘘嘘| 洋洋成人永久网站入口| 久久欧美一区二区| 在线播放中文字幕一区| 99久久免费精品| 精品一区二区影视| 亚洲成a人片综合在线| 国产精品毛片高清在线完整版| 欧美老年两性高潮| 91亚洲国产成人精品一区二区三 | 国产精品资源在线| 日韩电影在线免费看| 亚洲视频中文字幕| 久久久精品国产免费观看同学| 欧美日韩在线直播| 一本久道久久综合中文字幕| 国产美女娇喘av呻吟久久| 日本不卡在线视频| 亚洲午夜视频在线| 一区二区三区在线免费观看| 亚洲国产电影在线观看| 久久综合视频网| 91精品国产麻豆国产自产在线| 色琪琪一区二区三区亚洲区| 国产成人精品1024| 国产精品综合网| 激情综合色丁香一区二区| 青青草视频一区| 日韩精品色哟哟| 首页国产丝袜综合| 亚洲成人免费电影| 性做久久久久久免费观看| 亚洲线精品一区二区三区八戒| 亚洲色图在线看| 一区二区三区在线视频观看 | 天天综合色天天| 亚洲一区二区av电影| 亚洲男同1069视频| 一区二区三区视频在线观看| 成人欧美一区二区三区1314| 亚洲欧洲日韩一区二区三区| 国产精品色噜噜| 综合久久一区二区三区| 亚洲毛片av在线| 亚洲成a人v欧美综合天堂下载| 亚洲午夜在线观看视频在线| 肉色丝袜一区二区| 久久国产剧场电影| 国产伦精品一区二区三区免费| 国产成人精品亚洲午夜麻豆| 懂色av一区二区三区蜜臀| 91原创在线视频| 欧洲一区在线电影| 日韩欧美一区二区久久婷婷| 欧美α欧美αv大片| 国产女人aaa级久久久级| 亚洲欧洲精品一区二区精品久久久 | 亚洲一区二区三区爽爽爽爽爽 | 国产成人精品一区二区三区网站观看| 国产乱理伦片在线观看夜一区| 懂色av一区二区三区蜜臀| 91麻豆国产在线观看| 91精品免费观看| 久久精品亚洲国产奇米99| 亚洲特黄一级片| 免费欧美在线视频| 福利一区二区在线| 欧美日韩国产成人在线91| 精品国产91久久久久久久妲己 | 蜜臀av性久久久久蜜臀av麻豆| 精品亚洲国产成人av制服丝袜| 成人理论电影网| 欧美蜜桃一区二区三区| 国产欧美日韩在线| 亚洲一二三区不卡| 国产a级毛片一区| 欧美男同性恋视频网站| 国产欧美中文在线| 午夜亚洲国产au精品一区二区| 国产成人精品综合在线观看| 欧美私人免费视频| 中文字幕免费不卡在线| 日韩在线a电影|