一个完善的应用程序不仅应该有实用的功能,还要有一个漂亮的外观,这样才能使应用程序更加友好,更加吸引用户。作为一个跨平台的UI开发框架,Qt提供了强大而灵活的界面外观设计机制。这一章将学习在Qt中设计应用程序外观的相关知识,会对Qt风格QStyle和调色板QPalette进行简单介绍,以及介绍不规则窗体和透明窗体的实现方法。

一、Qt风格

Qt中的各种风格是一组继承自QStyle的类。QStyle类是一个抽象基类,封装了 一个GUI的外观,Qt的内建(built-in)部件使用它来执行几乎所有的绘制工作,以确保它们看起来可以像各个平台上的本地部件一样。一些风格已经内置在了Qt中,例如Winders风格和Motif风格;而有些风格只在特定的平台上才有效,例如Windows XP风格、Windows Vista风格和Mac OS X风格。Qt提供的风格类如下表所列。

类名 介绍
QCDEStyle CDE(Common Desktop Environment)风格
QCleanlooksStyle 类似于GNOME中的Clearlook风格
QGtkStyle GTK +风格
QMotifStyle Motif风格
QMacStyle Mac OS X风格
QPlastiqueStylc 类似于KDE中的Plastik风格
QWindowsStyle 微软Windows风格
QWindowsVistaStyle 微软Windows Vista风格
QWinclowsXPStyle 微软Windows XP风格

在使用Qt Creator设计模式设计界面时,可以使用Qt提供的各种风格进行预览, 当然也可以使用特定的风格来运行程序。下面来看具体的例子。

1.1 使用不同风格预览程序

新建Qt Gui应用,项目名称为myStyle,类名为MainWindow,基类保持QMainWindow不变。建立完项目后,单击mainwindow. ui文件进入设计模式,向界面上拖人一个Label、Push Button、 Spin Box、Line Edit 和 Progress Bar。 然后选择“工具→From Editor→Preview in”菜单项,这里列出了现在可用的几种风格,这里选择“CDE风格”,预览效果如图8-1所示。也可以使用其他几种风格进行预览。

1.2 使用不同风格运行程序

如果想使用不同的风格来运行程序,那么只需要调用QApplication的setStyle()函数指定要使用的风格即可。现在打开main.cpp文件,然后添加#include <QMotifStyle>头文件包含(注意windows下的Qt版本不包含该头文件),并在main()函数的“QApplication a(argc,argv);”一行代码后添加如下一行代码:

a.setStyle(new QMotifStyle);

这时运行程序,便会使用Motif风格。如果不想在程序中指定风格,而是想在运行程序时再指定,那么就可以在使用命令行运行程序时通过添加参数来指定,比如要使用Motif风格,则可以使用“-style motif”参数。而如果不想整个应用程序都使用相同的风格,那么可以调用部件的setStyle()函数来指定该部件的风格。进人mainwindow. cpp文件,先添加头文件#include <QWindowsXPStyle>(在最新的Qt5中已经去掉了该类,使用QCommonStyle替换),然后在构造函数中添加如下一行代码:

ui->progressBar->setStyle(new QWindowsXPStyle);

这时再次运行程序,其中的进度条部件就会使用Windows XP的风格了。另外,还可以使用QStyleFactory::keys()函数来获取当前系统所支持的风格。

除了Qt中提供的这些风格外,也可以自定义风格,一般的做法是子类化Qt的风格类,或者子类化QStyle类。关于这个内容这里不再讲述,有兴趣的读者可以查看Styles示例程序,它在Widgets分类下。关于Qt风格更多的内容,可以查看Styles and Style Aware Widgets关键字。

1.3 调色板

调色板QPalette类包含了部件各种状态的颜色组。一个调色板包含3种状态:激活(Active)、失效(Disabled)和非激活(Inactive)。Qt中的所有部件都包含一个调色板,并且使用各自的调色板来绘制它们自身,这样可以使用户界面更容易配置,也更容易保持一致。调色板中的颜色组包括:

  • 激活颜色组QPalette::Active,用于获得键盘焦点的窗口;
  • 非激活颜色组QPalette::Inactive,用于其他的窗口;
  • 失效颜色组QPalette::Disabled,用于由于一些原因而不可用的部件(不是窗口)。

要改变一个应用程序的调色板,可以先使用QAppliCation::palette()函数来获取其调色板,然后对其进行更改,最后再使用QApplication::SetPalette()函数来使用该调色板。更改了应用程序的调色板,会影响到该程序的所有窗口部件。如果要改变一个部件的调色板,可以调用该部件的palette()和setPalette()函数,这样只会影响该部件及其子部件。下面来看一个例子。

仍然在前面的程序中进行更改。在mainwindow.cpp文件中添加头文件#include <QPalette>,然后在构造函数中继续添加如下代码:

//获取 pushButton 的调色板
QPalette palette1 = ui->pushButton->palette();
//设置按钮文本颜色为红色
palette1.setColor(QPalette::ButtonText,Qt::red);
//设置按钮背景色为绿色
palette1.setColor(QPalette::Button,Qt::green);
//pushButton 使用修改后的调色板
ui->pushButton->setPalette(palette1);
//设置 lineEdit 不可用
ui->lineEdit->setDisabled(true);
QPalette palette2 = ui->lineEdit->palette();
//设置行编辑器不可用时的背景颜色为蓝色
palette2.setColor(QPalette::Disabled,QPalette::Base,Qt::blue);
ui->lineEdit->setPalette(palette2);

设置调色板颜色时可以使用setColor()函数,这个函数需要指定颜色角色(Color Role)。在QPalette中,颜色角色用来指定该颜色所起的作用,例如是背景颜色或者是文本颜色等,主要的颜色角色如下表所列。对于在设计模式中添加到界面上的部 件,也可以在其属性编辑器中通过修改palette属性来设置它的调色板,这样还可以预览修改后的效果。对于调色板更多的知识,可以参考QPalette类的帮助文档。

常量 描述
QPalette::Window 一个一般的背景颜色
QPalette::WindowText 一个一般的前景颜色
QPalette::Base 主要作为输人部件(如QLineEdit)的背贵色,也可用作QComboBox的下拉列表的背景色
QPalette::AlternateBase 在交种行颜色的视图中作为交替背景色
QPalette::ToolTipBase 作为QToolTip和QWhatsThis的背景色
QPalette::ToolTipText 作为QToolTip和QWhatsThis的前景色
QPalette::Text 和Base—起使用,作为前景色
QPalette::Button 按钮部件背景色
QPalette::ButtonText 按钮部件前景色

二、特殊效果窗体

2.1 不规则窗体

使用样式表可以实现矩形、圆形等规则形状的部件,不过,有时想设计一个不规则形状的部件或者窗口,以使得应用程序的外观更加个性化。Qt中提供了部件遮罩 (mask)来实现不规则窗体。

新建Qt Gui应用,项目名称为myMask,基类选择QWidget,类名保持Widget不变。建立好项目后向项目目录中放一张背景透明的png图片(这里是yafeilinux. png),然后再向项目中添加一个Qt资源文件, 建立好后先添加前缀“/image”,然后再将png图片添加进来并保存更改。下面进人widget.h文件,声明两个事件处理函数:

protected:
void paintEvent(QPaintEvent *);
void mousePressEvent(QMouseEvent *);

然后到widget.cpp文件中,先添加头文件包含:

#include <QPixmap>
#include <QBitmap>
#include <QPainter>

再在构造函数中添加如下代码:

QPixmap pix;
// 加载图片
pix.load(":/image/yafeilinux.png");
// 设置窗口大小为图片大小
resize(pix.size());
// 为窗口设置遮罩
setMask(pix.mask());

这里使用QPixmap类加载了资源文件中的图片,然后调用setMask()函数来为窗口设置遮罩。下面是两个事件处理函数的定义:

void Widget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
// 从窗口左上角开始绘制图片
painter.drawPixmap(0, 0, QPixmap(":/image/yafeilinux.png"));
} void Widget::mousePressEvent(QMouseEvent *)
{ // 关闭窗口
close();
}

这里必须在paintEvent()函数中将图片绘制在窗口上,这样运行程序时才可以正常显示图片。在鼠标按下事件中,只是进行了简单的关闭窗口操作。

这个程序使用了一张图片来设置遮罩,其实还可以使用QRegion设置一个区域来作为遮罩,这个就不再讲解了。

2.2 透明窗体

如果想实现窗体内容部件的透明效果,只需在设置其背景色时指定alpha值即可,例如:

QPushButton{background-color:rgba(255, 255, 255, 100)}

其中rgba()中的a就是指alpha,取值为0〜255,取值为0时完全透明,取值为255时完全不透明。这里a的值为100,这样会出现半透明的效果,因为前面的r(红)、g (绿)、b(蓝)的值均为255,所以是白色,这样最终的效果是按钮的背景为半透明的白色。

部件的透明效果可以使用这种方式来设置,但是,作为顶级部件的窗口却无法使用这种方式来实现透明效果。不过,可以使用其他两种方法来实现透明效果。

新建Qt Gui应用,项目名称为myTranslucent,基类选择QWidget,类名保持Widget不变。建好项目后,在设计模式向界面上拖入一个Label、Push Button和Progress Bar,然后在widget.cpp文件中的构造函数里添加一行代码:

// 设置窗口的不透明度为0.5
setWindowOpacity(0.5);

使用setWindowOpacity()函数就可以实现窗口的透明效果,参数取值范围为0.0〜1.0,当取值为0.0时完全透明,取值为1.0时完全不透明。这时运行程序,效果如下图所示。可以看到,这样实现的效果是整个应用程序界面都是半透明的,如果不想让窗口中部件透明,那该怎么实现呢?下面来看另一种方法。

先将构造函数中的setWindowOpacity()函数调用注释掉,然后再添加下面两行代码:

setWindowFlags(Qt::FramelessWindowHint);
setAttribute(Qt::WA_TranslucentBackground);

这里使用了setAttribute()函数指定窗口的Qt::WA_TranslucentBackground属性,它可以使窗体背景透明,而其中的部件不受影响。不过在Windows下,还要使用setWindowFlags()函数指定Qt::FramelessWindowHint标志,这样才能实现透明效果。运行程序,效果如图8-6所示。读者会发现,窗口没有了标题栏,这时要想关闭窗口,就要使用Qt Creator的应用程序输出栏上的红色按钮来强行关闭程序。这样实现的效果是背景完全透明的,要是还想实现半透明效果,可以使用重绘事件。

先在widget.h文件中声明paintEvent()函数:

protected:
void paintEvent(QPaintEvent *);

然后到widget.cpp文件中添加头文件#include <QPainter>,再进行paintEvent()函数的定义:

void Widget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.fillRect(rect(), QColor(255,255,255,100));
}

这里先使用rect()函数获取窗口的内部矩形,它不包含任何边框。然后使用半透明的白色对这个矩形进行填充,最终的效果如下图所示。对于fillRect()函数,可以指定任意的一个区域,所以可以实现窗体的部分区域全部透明,部分区域半透明或者不透明的效果。

使用第一种方法会使整个应用程序都成为半透明效果;而使用第二种方法,可以实现只是顶层窗口的背景透明,不过,它没有了标题栏和边框,需要手动为其添加一个标题栏。其实,对于一个个性化的窗体界面,没有标题栏也许正是想要的结果。

另外,使用第11章讲到的图形效果也可以实现部件的透明效果,而且使用它还可以实现模糊、阴影和染色等特殊效果。

[Qt Creator 快速入门] 第8章 界面外观的更多相关文章

  1. [Qt Creator 快速入门] 第2章 Qt程序编译和源码详解

    一.编写 Hello World Gui程序 Hello World程序就是让应用程序显示"Hello World"字符串.这是最简单的应用,但却包含了一个应用程序的基本要素,所以 ...

  2. [Qt Creator 快速入门] 第1章 Qt Creator简介

    Qt Creator 是一个跨平台的.完整的 Qt 集成开发环境,其中包括了高级C++代码编辑器.项目和生成管理工具.集成的上下文相关的帮助系统.图形化调试器.代码管理和浏览工具等.这一章先对 Qt ...

  3. [Qt Creator 快速入门] 第5章 应用程序主窗口

    对于日常见到的应用程序而言,许多都是基于主窗口的,主窗口中包含了菜单栏.工具栏.状态栏和中心区域等.这一章会详细介绍主窗口的每一个部分,还会涉及资源管理.富文本处理.拖放操作和文档打印等相关内容.重点 ...

  4. [Qt Creator 快速入门] 第3章 窗口部件

    从这一章开始正式接触Qt的窗口部件.在第2章曾看到 Qt Creator 提供的默认基类只有 QMainWindow.QWidget 和 QDialog 这3种.QMainWindow 是带有菜单栏和 ...

  5. [Qt Creator 快速入门] 第4章 布局管理

    第3章讲述了一些窗口部件,当时往界面上拖放部件时都是随意放置的,这对于学习部件的使用没有太大的影响,但是,对于一个完善的软件,布局管理却是必不可少的. 无论是想要界面中部件有一个很整齐的排列,还是想要 ...

  6. [Qt Creator 快速入门] 第9章 国际化、帮助系统和Qt插件

    一.国际化 国际化的英文表述为Internationalization,通常简写为I18N(首尾字母加中间的字符数),一个应用程序的国际化就是使该应用程序可以让其他国家的用户使用的过程. Qt支持现在 ...

  7. [Qt Creator 快速入门] 第0篇 开始学习Qt 与Qt Creator

    Qt官方信息 Qt官网:http://qt.digia.com/ Qt开源官网:http://qt-project.org/ Qt最新版本下载:http://qt-project.org/downlo ...

  8. QT Creator 快速入门教程 读书笔记(一)

    一 Qt简介 Qt 是一个跨平台的C++应用程序框架,支持Windows.Linux.Mac OS X.Android.iOS.Windows Phone.嵌入式系统等.也就是说,Qt 可以同时支持桌 ...

  9. 《QT Creator快速入门》

    ui中的类,这样使用无法通过调试: Ui::Dialog ui(&w); w.show(); 而需要改成: Ui::Dialog ui; ui.setupUi(&w); w.show( ...

随机推荐

  1. DFS template and summary

    最近一直在学习Deep Frist Search,也在leetcode上练习了不少题目.从最开始的懵懂,到现在遇到问题基本有了思路.依然清晰的记得今年2月份刚开始刷题的时做subsets的那个吃力劲, ...

  2. Codeforces 645A Amity Assessment【八数码】

    题目链接: http://codeforces.com/problemset/problem/645/A 题意: 2*2的八数码问题 分析: 这题n为2,不需要搜索,直接判断字母排列顺序就好了. 注意 ...

  3. HDU.P1100 Trees Made to Order 解题报告

    http://www.cnblogs.com/keam37/p/3637717.html  keam所有 转载请注明出处 Problem Description We can number binar ...

  4. easyUi 学习笔记 (一) 使用easyui 和ztree 创建前端框架

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  5. 有用的 SystemTap 脚本

    https://segmentfault.com/a/1190000000680628 https://github.com/posulliv/stap

  6. 镜像二叉树——剑指Offer

    https://www.nowcoder.net/practice/564f4c26aa584921bc75623e48ca3011?tpId=13&tqId=11171&tPage= ...

  7. win7开启超级管理员账户(Administrator)

    win7开启超级管理员账户(Administrator) 不同于XP系统,Windows7系统据说出于安全的考虑,将超级管理员帐户"Administrator"在登陆界面给隐藏了, ...

  8. Codeforces Round #271 (Div. 2) D. Flowers (递推 预处理)

    We saw the little game Marmot made for Mole's lunch. Now it's Marmot's dinner time and, as we all kn ...

  9. Linux操作系统改动PATH的方法

    1. 暂时改动: 使用export.比如#export PATH=$PATH:/etc/apache/bin 2. 针对用户的改动: vi ~/.bash_profile 增加:export PATH ...

  10. c#控件重绘的问题

    1.当Panel有背景图像的时候,往Panel添加控件(带图像),画面会非常闪烁,所以,Panel尽量不要带背景图像 2.带背景图像可以参考designer.cs里面的写法... 添加Control之 ...