Qt入门学习之美化与样式设置

一、QT界面美化

QT中的各种风格是一组继承自QStyle的类,QStyle类是一个抽象基类,封装了一个GUI的外观,Qt内建(built-in)部件使用它来执行几乎所有的绘制工作,以确保他们看起来像各个平台上的本地部件一样。QStyleFactory类可以创建一个QStyle对象。首先通过keys()函数获取可用的风格,然后使用create()函数创建一个QStyle对象。一般windows风格和fusion风格是默认可用的,而有些风格只在特定的平台上才有效,windowsxp风格,gtk风格、macintosh风格等。

  • 如果想使用不同的风格来运行程序,只需要调用QApplication的setStyle()函数指定要使用的风格即可。
    如:在main()函数的“QApplication a(argc,argv);”一行代码后添加一行代码:
    a.setStyle(QStyleFactory::create(“fusion”));
    添加成功后运行代码,程序便会使用Fusion风格了。
  • 如果不想整个应用程序使用相同的风格,可以调用部件的setStyle()函数来指定该部件的风格。
    如:需要将slider看控件设置为fusion风格,则需要在ui->setupUi(this);后添加:
    ui->slider->setStyle(QStyleFactory::create(“fusion”));
    添加成功后运行代码,程序中的slider控件就会使用fusion风格。

二、调色板

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

  • 激活颜色组QPalette::Active,用与获取键盘焦点的窗口
  • 非激活颜色组QPalette::Inactive,用于其他窗口
  • 失效颜色组QPalette::Disabled,用于因为一些原因无法使用的部件(不包含窗口)
    1、要改变一个应用程序的调色板
    先使用QApplication::Palette()函数来获取调色板, 然后对其进行更改,最后在使用QApplication::setPalette()函数来使用该调色板。更改应用程序的调色板会影响该程序的所有窗口部件。如果改变一个部件的调色板,可以调用该部件的palette()和setPalette()函数,这只会影响该部件及其子部件。
    2、设置调色板的颜色
    设置调色板的颜色可以使用setColor()函数,这个函数需要指定颜色角色(Color Role)。在QPalette中,颜色角色用来指定该颜色所起的作用,例如是背景颜色或者文本颜色等。主要的颜色角色如表所示:
常量 描述
QPalette::Window 一般背景颜色
QPalette::WindowText 一般的前景颜色
QPalette::Base 主要作为输入部件(如QLinEdit)的背景色,也可作为QComboBox的下拉列表的背景色或者QToolBar的手柄颜色,一般为白色或者其他浅色
QPalette::AltematcBase 在交替行颜色的视图中作为交替背景色
QPalette::ToolTipBase 作为QToolTip和QWhatsThis的背景颜色
QPalette::ToolTipText 作为QToolTip和QWhatsThis的前景色
QPalette::Text 和Base一起使用,作为前景色
QPalette::Button 按钮部件背景色
QPalette::ButtonText 按钮部件前景色
QPalteet::BrightText 一种与深色对比度较大的文本颜色,一般用于Text或Window Text的对比度较差时

如:利用应用程序调试板修改窗口背景色和按钮前景色
QApplication a(argc,argc);
QPalette palette=a.palette();//获取应用程序调色板
palette.setColor(QPalette::Window,Qt::red);//设置窗口背景色
palette.setColor(QPalette::ButtonText,Qt::blue);//设置按钮前景色
a.setPalette(palette);//设置应用程序修改后的调色板

三、样式表

Qt样式表是一个可以自定义部件外观的十分强大的机制。Qt样式表的概念、术语、语法都受到了HTML的层叠样式表(CSS)的启发,不过与CSS不同的是,Qt样式表应用于部件,所以又简称QSS。

  • 可以使用QApplication::setStyleSheet()函数将其设置到整个应用程序上;
  • 也可以用QWidget::setStyleSheet()函数将其设置到一个指定的部件(还有他的子部件)上;
  • 如果在不同的级别都设置了样式表,那么Qt会使用所有有效的样式表,这被称为样式表层叠。

1、使用样式表

  1. 使用代码设置样式表
    如:设置pushButton的背景色为黄色
    ui->pushButton->setStyleSheet(“background:yellow”);
    这样调用指定的部件setStyleSheet()函数只会对这个部件应用该样式表,如果想对所有的相同部件都使用相同的样式表,可以在他们的父部件上设置样式表,如L有pushbutton、slider两个部件在MainWindow上,可以为MainWindow设置样式表:
    setStyleSheet(“QPushButton{background:yellow}QSlider{background:blue}”);
    这样以后再往主窗口上添加的QPushButton部件和QSlider部件的背景色都会改为这里指定的颜色。

  2. 在设计模式使用样式表
    进入设计模式。在界面上点击鼠标右键, 在弹出的菜单中选择“改变样式表。在打开的编辑样式表窗口中设置样式表,设置完成后点击应用+确定即可成功修改样式表。

2、样式表语法
样式规则:
(1)、样式表包含了一系列的样式规则,一个样式规则由一个选择器(selector)和一个声明(declaration)组成。选择器指定了受该规则影响的部件;声明指定了该部件上要设置的属性。
如:QPushButton{color.red}
在这样的样式规则中,QPushButton是选择器,{Color:red}是声明,而Color是属性,red是属性值。这个规则指定了QPushButton和他的子类应该使用红色作为它们的前景色。
(2)、Qt样式表中一般不区分大小写,如color、Color表示的是相同的属性。只是类名、对象名和Qt属性名是区分大小写的。
(3)、一些选择器可以指定相同的声明,只需要使用逗号隔开,如:
QPushButton,QLineEdit,QComboBox{color:red}
(4)、一个样式规则的声明部分是一些"属性:值"对组成的列表,它们包含在大括号中使用分好隔开。如:
QPushButton{color:red;background-color:white}

3、选择器类型

常用选择器类型 说明
通用选择器 (*) 匹配所有部件
类型选择器(QPushButton) 匹配所有QPushButton实例和他的子实例
属性选择器(QPushButton[flat=“false”]) 匹配QPushButton的属性flat是false的实例
类选择器(QPushButton) 匹配所有QPushButton实例,但不包括他的子类
ID选择器(QPushButton#okButton) 匹配所有QPushButton中以okButton为对象名的实例
后迭代选器(QDialog QPushButton) 匹配所有QPushButton实例,他们必须是QDialog的子孙部件
还是迭代器 (QDialog>QPushButton) 匹配所有普QPushButton实例,它们必须是QDialog的直接子部件

4、子控件
对于一些复杂的部件修改样式,可能需要访问他们的子控件,例如QComboBox的下拉按钮,还有QSpinBox的向上或者向下的箭头等。选择器可以包含子控件对部件的特定子控件应用规则。
如:QComboBox的下拉按钮设定样式
QComboBox::drop-down{image:url(dropdown.png)}
这样就可以改变所有的QComboBox部件的下拉按钮的样式。

5、伪状态
(1)选择器可以包含伪状态来限制规则在部件指定的状态上应用。伪状态出现在选择器之后,用冒号隔开,如:QPushButton:hover{color:white}
这个规则表明当鼠标悬停在一个QPushButton部件上时才被应用。伪状态可以使用感叹号表示否定,如QPushButton:!hover{color:white}
(2)伪状态可以有多个连用,达到逻辑与效果,如,当鼠标悬停在一个被选中的QCheckBox部件上时才应用规则,那么这个规则就可以写为:QCheckBox:hover,QCheckBox:checked{color:white}

6、冲突解决
当几个样式规则对相同的属性指定了不同值时就会产生冲突,如:
QPushButton#okButton{color:gray}
QPushButton{color:red}
这样okButton的color属性便产生了冲突。解决这个冲突的原则:特殊的选择器优先,在这里因为QPushButton#okButton一般代表一个单一的对象,而不是一类所有的实例,所以他比QPushButton特殊,那么这是便使用第一个规则,okButton的文本颜色为灰色。

相似的有伪状态比没有伪状态优先,如果两个选择器特殊性相同,则后面出现的比前面的优先。部件自己的样式表优先于任何继承的样式表。

7、部件的盒子模型
在使用样式表时,每一个部件都可以被看作是拥有四个通信矩形的盒子,如下图所示。分别是内容(content)、填衬(padding)、边框(border)、边距(margin).后三个默认值为0,这样四个矩形恰好重合。
Qt入门学习之美化与样式设置_第1张图片
8、换肤功能(实战)
Qt样式表可以存放在一个以.qss为后缀的文件中,这样就可以在程序中调用不同的.qss文件来实现换肤功能。
当使用设计器中的样式设计工具设计出我们需要的效果后,可以在工程中创建一个.qss格式的文件,并将样式设计工具中所有内容剪切到.qss文件中保存,并将.qss格式的文件添加到资源文件中。这样接下来就可以在程序中低啊用不同的.qss文件实现换肤功能。如:
在构造函数中通过.qss文件为应用程序换肤
QFile file(":/my.qss");//创建文件柄
file.open(QFile""ReadOnly);//以只读方式打开文件
setStyleSheet(file.readAll());//以file中读取到所有内容设置各个部件的样式,已达到换肤目的。

你可能感兴趣的:(QT软件开发,Qt入门学习之美化与换肤)