程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 讓你的 Qt 桌面程序看上去更加 native(四):style sheet

讓你的 Qt 桌面程序看上去更加 native(四):style sheet

編輯:關於C語言

臨近春節,更新也慢了許多。今天再來寫一篇,不知道會不會是春節前的最後一篇了。豆子先祝大家新春愉快!

我們知道,HTML 僅僅被定義為一種內容布局的語言。也就是說,HTML 應該做的,是告訴浏覽器,這個東西應該放在這裡,那個東西應該放在那裡。至於這些東西該怎麼顯示,例如,用紅色還是用藍色,這樣的顯示的定義應該交給 CSS 去做。所以,在新近版本的 HTML 中,font、color 這樣的標簽和屬性已經不被推薦使用了。同樣,在 Qt 中也有這麼一個樣式表,被稱為 style sheet——這其實和 CSS 如出一轍。不僅名字相似,就連語法之類也相當雷同。

style sheet 雖然很好用,但是,我們應該提出幾個需要注意的地方。style sheet 應該被小心使用,因為它會打破系統正常的 look and feel。還記得我們前面提到的那個同普通 Windows 程序格格不入的 safari 嗎?所以在使用 style sheet 時應該盡量選用系統調色板,而不是自己定義一個另類的顏色。

關於 style sheet 語法更詳細的手冊,我們可以到這裡去查看。當然,如果你安裝的是 mingw 版本的 QtWindows 平台),這個文檔已經在 Qt Help 裡面了。在這裡,我們不去詳細介紹具體的語法細節,而是專注於如何正確使用 style sheet。所以,如果你有的語法看不懂,請自行查閱文檔了解。

自己定義 label 的顏色固然很簡單,請看以下代碼:

  1. #include <QtGui> 
  2.  
  3. int main(int argc, char *argv[]) 
  4.     QApplication app(argc, argv); 
  5.  
  6.     QLabel label; 
  7.     label.setText("Hello, style sheet!"); 
  8.     label.setStyleSheet(QString("color:red")); 
  9.     label.show(); 
  10.  
  11.     return app.exec(); 

我們將 label 的顏色使用 style sheet 定義為紅色,運行起來如下圖所示:

這種預定義的顏色很簡單,然而,如果我想用個系統顏色呢?比如,我希望是系統高亮的顏色?難道還得自己去找高亮色的 RGB 值嗎?正確的做法是,使用系統調色板,如下代碼所示:

  1. label.setStyleSheet(QString("color:palette(highlight)")); 

這樣,我們直接從系統調色板中得到高亮色,即便是不同的系統,也不需要修改任何代碼。以下是在 Windows 7 上面的運行結果:

即使你必須使用自定義顏色,也不應該將顏色硬編碼。而是使用一種變通的方式,例如:

  1. QColor color(128, 200, 128); 
  2. label.setStyleSheet(QString("color:%1").arg(color.name())); 

這樣做的好處是,你可以很方便地讓用戶選擇顏色,存入配置文件,並且在以後的啟動中從配置文件中讀取 color 的值,而不需要修改代碼。

使用 style sheet 可以做出很漂亮的顯示效果。由於使用 style sheet 要比 前面說的自定義 style 簡單得多,因此,我們還是建議多多使用這一技術。下面,我們制作一個蘋果風格的前進/後退按鈕。效果如下:

為了制作這一按鈕,我們需要以下四幅圖片:

按照從上向下的順序分別命名為 btn_left.png, btn_left_pressed.png, btn_right.png 和 btn_right_pressed.png。然後,我們用下面的代碼:

  1. #include <QtGui> 
  2.  
  3. int main(int argc, char *argv[]) 
  4.     QApplication app(argc, argv); 
  5.  
  6.     QWidget segmentedButton; 
  7.     QToolButton *backButton = new QToolButton(&segmentedButton); 
  8.     QToolButton *forwardButton = new QToolButton(&segmentedButton); 
  9.     segmentedButton.setLayout(new QHBoxLayout); 
  10.     segmentedButton.layout()->setSpacing(0); 
  11.     segmentedButton.layout()->setMargin(0); 
  12.     backButton->setStyleSheet(QString("QToolButton{border-image:url(:/btn_left.png)}" 
  13.                                       "QToolButton:pressed{border-image:url(:/btn_left_pressed.png)}")); 
  14.     forwardButton->setStyleSheet(QString("QToolButton{border-image:url(:/btn_right.png)}" 
  15.                                       "QToolButton:pressed{border-image:url(:/btn_right_pressed.png)}")); 
  16.     backButton->setFixedSize(28, 23); 
  17.     forwardButton->setFixedSize(28, 23); 
  18.     segmentedButton.layout()->addWidget(backButton); 
  19.     segmentedButton.layout()->addWidget(forwardButton); 
  20.  
  21.     QWidget win; 
  22.     win.setLayout(new QHBoxLayout); 
  23.     win.layout()->setSpacing(0); 
  24.     win.layout()->setMargin(0); 
  25.     win.layout()->setAlignment(Qt::AlignLeft); 
  26.     win.layout()->addWidget(&segmentedButton); 
  27.     win.show(); 
  28.  
  29.     return app.exec(); 

即可得到上圖所示的效果。注意,我們之所以把 segmentedButton 又放入一個新的 widget 裡面,是由於 Windows 平台下的窗口有一個最小值。如果直接調用 segmenedButton.show(); ,由於這個最小值的緣故,兩個 button 並不會在一起。使用這一技術,我們很容易制作出很漂亮的界面。這一技術的關鍵就在於圖片素材的制作,將界面大部分工作交予美工。

本文出自 “豆子空間” 博客,請務必保留此出處http://devbean.blog.51cto.com/448512/487888

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved