## 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】按钮进入到下一步的设置界面。
![](https://box.kancloud.cn/2016-01-22_56a1a14e4aab4.png)
图 9-2 选择项目类型
然后,在弹出的【Empty Qt4 Project】对话框里为项目设置名称和保存位置,这里项 目名称为 styleCreator。注意,名称和保存的位置中都不要含有空格、特殊字符和中文字符。 图 9-3 和图 9-4 显示了这个设置的过程。
![](https://box.kancloud.cn/2016-01-22_56a1a155d2dde.png)
图 9-3 设置项目名称和要保存的位置
![](https://box.kancloud.cn/2016-01-22_56a1a155ef1a1.png)
图 9-4 设置项目保存的位置
这之后,一路选择默认设置即可完成项目的创建。如果读者朋友对使用 Qt Creator 的 使用有不熟悉的地方,可以参见第 6 章和第 12 章。
第 2 步,设计界面。
我们在 Qt Designer 中设计出来的界面布局如图 9-5 所示,具体的布局结构可以从对象 查看器中得到,不再赘述。
界面设置完成后,将其保存在第 1 步创建的项目目录下面,名为 styleCreator.ui。
![](https://box.kancloud.cn/2016-01-22_56a1a1560b638.png)
图 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】按钮,进入到下 一步设置。
![](https://box.kancloud.cn/2016-01-22_56a1a14eefb3d.png)
图 9-6 新增 C++源文件
在接下来弹出的【Chose the location】对话框中设置新建文件的名称和要保存的位置 , 这里要选中第 1 步创建好的项目的位置。如图 9-7 所示。点击【Next】按钮进入下一步。
![](https://box.kancloud.cn/2016-01-22_56a1a1561f144.png)
图 9-7 选择文件的位置
接下来,在弹出的【Project management】对话框中选中那个 Add to Project 复选框, 并选择第 1 步创建好的项目 Project 名称。如图 9-8 所示,点击【Finish】按钮完成新文件 的添加。
![](https://box.kancloud.cn/2016-01-22_56a1a1563be0e.png)
图 9-8 选择项目名称
第 2 种方法介绍如下,如图 9-9 所示,在 Qt Creator 中的项目栏上点击鼠标右键,选 择 Add Existing Files...菜单项,将你在项目外面书写好的文件加入到项目中。对于前面 使用 Qt Designer 做好的 styleCreator.ui 文件,我们使用这种方法把它加入到项目中。
![](https://box.kancloud.cn/2016-01-22_56a1a15656078.png)
图 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 开发社区