## 9.2 QStyle 類的使用
說到樣式表,就不可避免的要談到 Qt 的樣式(Qt Style)。
在 Qt 樣式表出現之前,我們主要是通過子類化 QStyle 類或者預定義一個樣式,例如 QWindowStyle,來定制應用程序的觀感,而 Qt 本身也是使用這種方法來為它所支持的不同平 臺提供特定的觀感的。
QStyle 類的應用比較廣泛。它封裝了 GUI 應用程序所使用的觀感樣式,是一個抽象基類。 Qt 包含了一系列的 QStyle 的子類,它們模擬了在各種不同平臺上的 GUI 界面的觀感,這些 觀感可以通過設置 QWindowStyle、QMacStyle、QMotifStyle 等樣式來實現,而且在我們調用 QtGui 這個模塊時,如果事先沒有顯式的指定,那么 Qt 會自動判斷環境并選擇最為適合的樣 式。此外,樣式也可作為插件來被應用程序使用。
下面我們使用 Qt Creator 結合代碼,創建一個實例,大家從中可以學習到使用 QStyle 類配置應用程序的觀感的方法。
### 9.2.1 實例-使用 QStyle
本實例的代碼見 styleCreator 實例。
第 1 步,創建項目。
啟動 Qt Creator,在彈出的【New...】對話框中選擇 Empty Qt4 Project 類型,如圖所 示,點擊【OK】按鈕進入到下一步的設置界面。

圖 9-2 選擇項目類型
然后,在彈出的【Empty Qt4 Project】對話框里為項目設置名稱和保存位置,這里項 目名稱為 styleCreator。注意,名稱和保存的位置中都不要含有空格、特殊字符和中文字符。 圖 9-3 和圖 9-4 顯示了這個設置的過程。

圖 9-3 設置項目名稱和要保存的位置

圖 9-4 設置項目保存的位置
這之后,一路選擇默認設置即可完成項目的創建。如果讀者朋友對使用 Qt Creator 的 使用有不熟悉的地方,可以參見第 6 章和第 12 章。
第 2 步,設計界面。
我們在 Qt Designer 中設計出來的界面布局如圖 9-5 所示,具體的布局結構可以從對象 查看器中得到,不再贅述。
界面設置完成后,將其保存在第 1 步創建的項目目錄下面,名為 styleCreator.ui。

圖 9-5 界面布局
第 3 步,書寫并向項目中添加文件。
本項目中共有 styleCreator.pro、main.cpp、myWidget.h、myWidget.cpp、和 styleCreator.h 這幾個原生源文件。首先要向項目中加入這幾個文件,一般有兩種方法 。一種是直接在 Qt Creator 中定義、書寫并加入;一種是在 Qt Creator 之外書寫好,然后再加入進來。我們以 main.cpp 為例,簡要介紹這兩種方法。
第一種方法介紹如下,如圖 9-6 所示,首先依次點擊【File】→【New】,在彈出的【New...】 對話框中選擇要新建的類型,這里是 C++ Source File。然后,點擊【OK】按鈕,進入到下 一步設置。

圖 9-6 新增 C++源文件
在接下來彈出的【Chose the location】對話框中設置新建文件的名稱和要保存的位置 , 這里要選中第 1 步創建好的項目的位置。如圖 9-7 所示。點擊【Next】按鈕進入下一步。

圖 9-7 選擇文件的位置
接下來,在彈出的【Project management】對話框中選中那個 Add to Project 復選框, 并選擇第 1 步創建好的項目 Project 名稱。如圖 9-8 所示,點擊【Finish】按鈕完成新文件 的添加。

圖 9-8 選擇項目名稱
第 2 種方法介紹如下,如圖 9-9 所示,在 Qt Creator 中的項目欄上點擊鼠標右鍵,選 擇 Add Existing Files...菜單項,將你在項目外面書寫好的文件加入到項目中。對于前面 使用 Qt Designer 做好的 styleCreator.ui 文件,我們使用這種方法把它加入到項目中。

圖 9-9 使用右鍵菜單添加文件
第 3 步,書寫代碼。 我們選擇使用多繼承的方法,從原生界面文件實體類中派生出一個自定義類 myWidget,首先看一下頭文件。
```
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QDialog>
#include "ui_styleCreator.h"
class myWidget:public QDialog,public Ui::Dialog
{
Q_OBJECT
public:
myWidget( QDialog *parent = 0 );
public slots:
void slotChangeStyle(QString);
};
#endif // MYWIDGET_H
```
首先要包含 QDialog 類的聲明,接下來再加入對 ui_styleCreator.h 的包含。
注意聲明 myWidget 類的方法,是多繼承自 QDialog 類和定義在 ui_styleCreator.h 中定義的 Ui::Dialog 這個實體類。
由于程序中要用到 Qt 的核心機制-信號/槽,所以必須加上 Q_OBJECT 這個宏。然后聲明 構造函數和一個公有槽。
再來看一下類的定義文件。
```
#include "myWidget.h"
#include <QtGui>
myWidget::myWidget(QDialog *parent)
:QDialog(parent)
{
setupUi(this);
setWindowTitle(tr("Change Window Look And Feel"));
comboBox->addItems(QStyleFactory::keys());
this->spinBox->setRange(0,9);
this->lineEdit->setText(tr("Hello Qt Style,We Can Change It!"));
this->lineEdit->setReadOnly(true);
this->textEdit->setText("Hello Qt!\n Qt by Nokia is the standard framework for developing high-performance cross-platform applications.Qt provides single-source portability across Microsoft Windows, Mac OS X, Linux, all major commercial Unix variants, and embedded Linux. On embedded Linux, the Qt API is available as Qtopia Core.");
this->tableWidget->setRowCount(3);
tableWidget->setColumnCount(3);
connect(comboBox,SIGNAL(activated(QString)),this,SLOT(slotChangeStyle(QString)));
slotChangeStyle(QStyleFactory::keys()[5]);
}
void myWidget::slotChangeStyle(QString style)
{
QApplication::setStyle(QStyleFactory::create(style));
QApplication::setPalette(QApplication::style()->standardPalette());
}
```
下面我們講解一下這些代碼的作用。
第 1、2 兩行引入頭文件。
第 5 行初始化界面布局,該句一般放在構造函數的開頭。
第 6 行設置程序標題,注意在字符串前面要用到 tr()函數,使程序滿足國際化的要求。 第 7 行向組合框中加入具體的項值。
QStyleFactory 類用來創建 QStyle 對象。使用 QStyleFactory 的靜態方法 QStyleFactory::keys()可以獲得與具體平臺無關的內置的樣式,以及與平臺有關的部分樣式。與平臺無關的樣式主要包括"windows", "motif", "cde", "plastique" 和"cleanlooks"等風格,與平臺有關的主要包括"windowsxp", "windowsvista" 和"macintosh"等幾種樣式。 此外,書寫樣式時,注意它們的名稱是大小寫敏感的。
第 8 行為滑塊部件設定滑動的范圍。
第 9 行設置編輯框要顯示的文本內容。
第 10 行設置編輯框內容為只讀。
第 11 行設置文本框顯示的文本內容。
第 12 行設置表格部件的行數為 3 行。
第 13 行設置表格部件的列數為 3 列。
第 14 行連接組合框的觸發信號和窗體的 slotChangeStyle 槽。 第 15 行像調用普通函數一樣,調用 slotChangeStyle 槽函數。 第 17-21 行是 slotChangeStyle 槽的定義。
其中第 19 行通過調用 QApplication::setStyle()方法來設置應用程序的樣式,該方法 是 QApplication 類的靜態函數,其原型如下:
```
void QApplication::setStyle ( QStyle * style ) [static]
```
該方法的形參是 QStyle 類的對象,在本程序中,它的實參是通過
QStyleFactory::create()方法來獲得的。該方法原型如下:
```
QStyle * QStyleFactory::create ( const QString & key ) [static]
```
其形參是 QString 的對象,返回值是 QStyle 的對象,該方法是 QStyleFactory 類的靜態方法。
第 20 行調用 QApplication::setPalette()方法設置應用程序的顏色組合。該方法是 QApplication 類的靜態方法,其原型如下:
```
void QApplication::setPalette ( const QPalette & palette, const char * className = 0 ) [static]
```
它的作用是將應用程序原有的顏色組合用 palette 來替換。如果 className 被指定不為空,那么該方法將僅對該參數對應的窗口部件起作用;如果 className 取默認值 0,則 該方法將影響整個兒應用程序中的窗體部件的顏色組合,并且將之前在應用程序中設定的顏色組合替換掉。
最后像下面這樣書寫 main.cpp 文件內容,主要是將自定義的窗口部件顯示出來。
```
#include <QApplication>
#include <QWidget>
#include"ui_styleCreator.h"
#include"myWidget.h"
int main(int argc, char * argv[])
{
QApplication app(argc,argv);
myWidget widget;
widget.show();
return app.exec();
}
```
通過這個實例,我們可以看到使用 QStyle 類來設置應用程序或窗口部件的樣式是比較簡便的。
在 Qt 應用程序中,QStyle 類的使用非常廣泛。本章只是向大家介紹了經常會用到的基 本功能,其它的如如何創建一個自定義的樣式、如何使用這個自定義的樣式、怎樣使自定義 的窗口部件感知這個樣式等內容都是比較深入的話題,讀者朋友可以在掌握本 節內容的基礎 上,有選擇的學習。
- 第 1 章 走近 Qt
- 1.1 Qt 簡介
- 1.2 Qt 紀事概覽
- 1.3 Qt 套件的組成(以 Qt4.5 為準)
- 1.4 Qt 的授權
- 1.5 Qt 的產品
- 1.6 Qt 的服務與支持
- 1.7 Qt 的最新進展
- 1.8為什么選擇 Qt
- 1.9 問題與解答
- 1.10 總結與提高
- 第 2 章 Qt 的安裝與配置
- 2.1 獲取 Qt
- 2.2 協議說明
- 2.3 安裝 Qt
- 2.4 配置 Qt4 環境
- 2.5 問題與解答
- 2.6 總結與提高
- 第 3 章 Qt 編程基礎
- 3.1 標準 C++精講
- 3.2 Windows 編程基礎
- 3.3 Linux 編程基礎
- 3.4 Mac 編程基礎
- 3.5 問題與解答
- 3.6 總結與提高
- 第 4 章 Qt 4 集成開發環境
- 4.1 常見的 Qt IDE
- 4.2 Qt Creator
- 4.3 Eclipse
- 4.5 問題與解答
- 4.6 總結與提高
- 第 5 章 使用 Qt 基本 GUI 工具
- 5.1 使用 Qt Designer 進行 GUI 設計
- 5.2 使用 Qt Assistant 獲取在線文檔與幫助
- 5.3 使用 Qt Demo 學習 Qt 應用程序開發
- 5.4 問題與解答
- 5.5 總結與提高
- 第 6 章 Qt 4 程序開發方法和流程
- 6.1 開發方法
- 6.2 Hello Qt
- 6.3 幾個重要的知識點
- 6.4 問題與解答
- 6.5 總結與提高
- 第 7 章 對話框
- 7.1 QDialog 類
- 7.2 子類化 QDialog
- 7.3 快速設計對話框
- 7.4 常見內建(built in)對話框的使用
- 7.5 模態對話框與非模態對話框
- 7.6 問題與解答
- 7.7 總結與提高
- 第 8 章 主窗口
- 8.1 主窗口框架
- 8.2 創建主窗口的方法和流程
- 8.3 代碼創建主窗口
- 8.4 使用 Qt Designer 創建主窗口
- 8.5 中心窗口部件專題
- 8.6 Qt4 資源系統專題
- 8.7 錨接窗口
- 8.8 多文檔
- 8.9 問題與解答
- 8.10 總結與提高
- 第 9 章 Qt 樣式表與應用程序觀感
- 9.1 應用程序的觀感
- 9.2 QStyle 類的使用
- 9.3 樣式表概述
- 9.4 使用樣式表
- 9.5 問題與解答
- 9.6 總結與提高
- 第 10 章 在程序中使用.ui 文件
- 10.1 uic 的使用
- 10.2 Ui_YourFormName.h 文件的組成
- 10.3 編譯時加入處理.ui 文件的方法
- 10.4 運行時加入處理.ui 文件的方法
- 10.5 信號與槽的自動連接
- 10.6 問題與解答
- 10.7 總結與提高 本章主要講解了以下內容:
- 第 11 章 布局管理
- 11.1 基本概念和方法
- 11.2在 Qt Designer 中使用布局
- 11.3 基本布局實踐
- 11.4 堆棧布局
- 11.5 分裂器布局
- 11.6 自定義布局管理器
- 11.7 布局管理經驗總結
- 11.8 問題與解答
- 11.9 總結與提高
- 第 12 章 使用 Qt Creator
- 12.1 Qt Creator 概覽
- 12.2 Qt Creator 的組成
- 12.3 快捷鍵和常用技巧
- 12.4 Qt Creator 構建系統的設置
- 12.5 處理項目間依賴關系( Dependencies )
- 12.6 Qt 多版本共存時的管理
- 12.7 使用定位器在代碼間快速導航
- 12.8 如何創建一個項目
- 12.9 實例講解
- 12.10 使用 Qt Creator 調試程序
- 12.11 問題與解答
- 12.12 總結與提高
- 第 13 章 Qt 核心機制與原理
- 13.1 Qt 對標準 C++的擴展
- 13.2 信號與槽
- 13.3 元對象系統
- 13.4 Qt 的架構
- 13.5 Qt 的事件模型
- 13.6 構建 Qt 應用程序
- 13.7 總結與提高
- 附錄 A qmake 使用指南
- A.1 qmake 簡介
- A.2 使用 qmake
- 附錄 B make 命令
- B.1 命令解釋
- B.2 使用 make 自動構建
- 附錄 C Qt 資源
- C.1Qt 官方資源
- C.2 Qt 開發社區