当前位置: 首页 > article >正文

QT样式表详解

本文详细介绍qt的样式表,包含样式表如何使用,常见语句和选择器。

背景说明

样式表用于设置外观,他是设置控件外观的方式之一。其他方式如下:

  1. 控件的成员函数,如QWidget::setBackground
  2. 样式表
  3. 调色板

优先级依次提高。调色板有最高优先级。

样式表

qt控件通过setsytlesheet(“样式表代码”)来使用样式表代码。QWidget::setstylesheet设置的qss代码作用域是设置它的控件以及其子控件。

下面是qss代码的一个举例

QPushButton {
    background-color: red;
}

这个代码的意思是把作用域的QPushButton控件的背景颜色设置为红色。

到底是哪个QPushButton的背景变成红色取决于谁调用了setstylesheet来应用这个样式表。如果是某个Qframe调用,则容器内所有的按钮背景都是红色,但其他Qframe中的按钮不受影响,因为setstylesheet的作用域只有调用它的QFrame以及QFrame中的子控件。如果是某个QPushButton调用,则只有这个QPushButton背景会变成红色,。

setsytlesheet函数使用示例

下面通过简单的例子来示意setstylesheet函数怎么用。

#include <QApplication>
#include <QPushButton>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QPushButton button("Click me!");
    button.setGeometry(100, 100, 200, 50);

    button.setStyleSheet("QPushButton {"
                          "    background-color: red;"
                          "}"
                          );

    button.show();

    return a.exec();
}

像这样,界面上那个调用了setStyleSheet的按钮背景颜色就变成红色了。

加载全局qss样式

我们可以在一个文件中描述所有界面上所有控件的样式。然后使用QApplication::setStyleSheet来应用全局样式。这样做的好处是分离功能和外观布局。外观布局用qss写,如果外观只是变个颜色,添加一个新的qss文件就行了,其他代码甚至都不用重新编译。下面就是加载全局样式的示例

#include <QApplication>
#include <QFile>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QFile file(":/style.qss");  // 加载 qss 文件
    if (file.open(QFile::ReadOnly | QFile::Text))
    {
        QString styleSheet = QString::fromUtf8(file.readAll());
        a.setStyleSheet(styleSheet);  // 应用样式表
        file.close();
    }

    // 创建窗口和控件等代码
    // ...

    return a.exec();
}

这样写的qss代码,作用域是整个 应用程序。其中代码写在了style.qss文件中。

样式表的作用域、选择器、语句概念

  • 作用域是指qss语句可能对哪些区域的控件进行设置,它取决于setStyleSheet在哪里被调用。
  • 作用域是明确的,一旦调用了setStyleSheet,作用域就确定了。
  • 作用域不体现在qss代码中。而体现在setStyleSheet的位置。
  • 选择器是指对作用域内的哪些控件进行设置。
  • 选择器是可选的,可以不存在选择器。

qss代码由选择器和语句构成,其中选择器不一定有,qss代码语法如下

选择器{
	语句1;
	语句2;
}

下面将介绍分别介绍语句和选择器

语句

语句用来描述控件的外观,需要记忆。
设置控件背景颜色:background-color: <颜色值>;
设置控件前景颜色:color: <颜色值>;
设置控件背景图片:background-image: url(<图片路径>);
设置背景图片平铺至整个控件区域,当控件大小发生变化时,背景图片也会跟着变化:background-image: url(<图片路径>);
设置背景图片居中显示,当控件大小发生变化时,背景图片不会跟着变化:background-image: url(<图片路径>) 0 0 no-repeat;
将背景图片平铺至整个控件区域,当控件大小发生变化时,背景图片会等比例拉伸:background-image: url(<图片路径>) 0 0 stretch;
设置控件背景重复方式:background-repeat: <repeat|repeat-x|repeat-y|no-repeat>;
设置控件背景位置:background-position: <水平位置> <垂直位置>;
设置控件大小:width: <宽度>; height: <高度>;
设置控件最小大小:min-width: <宽度>; min-height: <高度>;
设置控件最大大小:max-width: <宽度>; max-height: <高度>;
设置控件透明度:opacity: <透明度>;
设置控件的对齐方式:alignment: <左|右|中>;
设置控件的间距:spacing: <距离>;
设置控件的填充:margin: <上> <右> <下> <左>;
设置控件的边框:border: <宽度> <样式> <颜色>;
设置控件的边框颜色:border-color: <颜色>;
设置控件的边框样式:border-style: <none|solid|dashed|dotted>;
设置控件的边框宽度:border-width: <宽度>;
设置控件的圆角半径:border-radius: <大小>;
设置控件的阴影:box-shadow: <位置> <大小> <颜色>;
设置控件的内边距:padding: <上> <右> <下> <左>;
设置控件的文本对齐方式:text-align: <left|right|center|justify>;
设置控件的文本装饰:text-decoration: <none|underline|overline|line-through>;
设置控件的文本字间距:letter-spacing: <距离>;
设置控件的文本行间距:line-height: <大小>;
设置控件的字体:font: <字体>;
设置控件的字体大小:font-size: <大小>;
设置控件的字体颜色:color: <颜色>;
设置控件的字体加粗:font-weight: <normal|bold>;
设置控件的字体斜体:font-style: <normal|italic>;
设置控件的字体下划线:text-decoration: <none|underline>;
设置控件的图标大小:icon-size: <宽度> <高度>;

选择器

选择器可以让我们定位到作用域里的某个或者某组控件,只设置这一个或者这一组控件的外观。比如作用域内上有好多按钮,我希望写一个qss,让一部分按钮的背景颜色是红色,另一部分是绿色。就需要用到选择器定位到那些有特殊要求的控件。

通用选择器

*{
	background-color: red;
}

* 就是通用选择器,它使得background-color: red作用于作用域内的所有控件。

类型选择器

选择指定的类及其子类

类名{
	语句;
}

QFrame{
	background-color: red;
}

选择的是作用域内的QFrame以及其子类如QLabel等。QPushButton不是QFrame的子类,所有不会被选择。

类选择器

区别于类型选择器,它只选择指定的类,而不选择其子类

.类名{
	语句;
}

.QFrame{
	background-color: red;
}

选择作用域内的QFrame,而其他类不受影响。

id选择器

----------------背景介绍-----------------------
控件可以通过setObjectName设置它的id。

QPushButton* bt1=new QPushButton();
bt1.setObjectName("button1");

----------------------------------------------------
选择指定id的控件。

#id{
	语句
}

#button1{
	background-color: red;
}

这样会把作用域内objectName为button1的所有控件背景颜色都设置成红色。

属性选择器

----------------背景介绍-----------------------
控件可以通过setProperty设置它的属性。

QPushButton* bt1=new QPushButton();
bt1.setProperty("level", "dangerous");

这样设置了bt1的level属性为dangerous
----------------------------------------------------
选择指定属性为指定值的控件

[属性名=属性值]{
	语句;
}

[level=dangerous]{
	background-color: red;
}

这样把作用域内所有level属性为dangerous的控件的背景颜色设置为了红色。

包含选择器

比较难描述定义,直接看示例吧

QFrame QPushButton {
    background: white;
}

这里使得QFrame下的QPushButton的背景颜色为白色。如果一个QPushButton不在某个QFrame中,是不会被选择的。
包含选择器可以不止两层,可以更多,比如QFrame下的QFrame下的QPushButton。

子元素选择器

选择一个控件的直接子控件。

父控件 > 子控件 {
	语句;
}

QFrame > QGroupBox {
    background: white;
}

选择QFrame下的QGroupBox,背景为白色,但不会影响QGroupBox的子控件。

伪类选择器

当控件处于某种状态时,选择它

控件名:[可选的“!”,!表示取反]状态{
	语句;
}

QCheckBox:!checked { 
color: red 
}

当QChectBox没有被选中时,它的颜色为红色。
常用状态

状态说明
:disabledWidget 被禁用时
:enabledWidget 可使用时
:focusWidget 得到输入焦点
:hover鼠标放到 Widget 上
:pressed鼠标按下时
:checked被选中时
:unchecked未选中时
:has-childrenItem 有子 item,例如 QTreeView 的 item 有子 item 时
:has-siblingsItem 有 兄弟,例如 QTreeView 的 item 有兄弟 item 时
:open打开或展开状态,例如 QTreeView 的 item 展开,QPushButton 的菜单弹出时
:closed关闭或者非展开状态
:onWidget 状态是可切换的(toggle), 在 on 状态
:offWidget 状态是可切换的(toggle), 在 off 状态

subcontrol选择器

选择控件的一部分。有些控件是由多个部分组成的,例如 QCheckBox 由 icon(indicator) 和 text 组成。

类名::部分{
	语句;
}

QCheckBox::indicator {
    width: 20px;
    height: 20px;
}
QCheckBox {
    spacing: 8px;
}

常用的控件部分

Subcontrol说明
::indicatorA QCheckBox, QRadioButton, checkable QMenu item, or a checkable QGroupBox’s indicator
::menu-indicatorA QPushButton’s menu indicator
::itemA QMenu, QMenuBar, or QStatusBar’s item
::up-buttonA QSpinBox or QScrollBar’s up button
::down-buttonA QSpinBox or QScrollBar’s down button
::up-arrowA QSpinBox, QScrollBar, or QHeaderView’s up arrow
::down-arrowA QSpinBox, QScrollBar, or QHeaderView’s down arrow
::drop-downA QComboBox’s drop-down arrow
::titleA QGroupBox or QDockWidget’s title
::grooveA QSlider’s groove
::chunkA QProgressBar’s progress chunk
::branchA QTreeView’s branch indicator

http://www.kler.cn/a/9700.html

相关文章:

  • 实现3D热力图
  • 【前端】HTML标签汇总
  • 计算机网络常见面试题(一):TCP/IP五层模型、TCP三次握手、四次挥手,TCP传输可靠性保障、ARQ协议
  • 【韩老师零基础30天学会Java 】06章 数组、排序和查找
  • Electron 项目中杀掉进程的不同方式
  • Java static静态变量 C语言文件读写
  • ChatGPT原理剖析
  • 云HIS源码:云HIS系统操作指南
  • 【数据结构】栈和队列(笔记总结)
  • PHP请求的好处,PHP如何请求淘宝开放接口
  • 代码随想录算法训练营第38天|509. 斐波那契数,70. 爬楼梯,746. 使用最小花费爬楼梯
  • 20230403在WIN10下通过ffmpeg调用NVIDIA的硬件加速wmv视频转码为MP4格式
  • WEB系统页面超过一定时间就自动跳转至登录页(或退出)
  • ios jenkins配置实现iOS项目自动化打包
  • 初谈 ChatGPT
  • 【python界面编程】基于tinker界面编程加法
  • 如何降低node 包版本
  • 一文读懂:低代码开发平台对企业效益有什么作用?
  • ant design pro + umi4的动态菜单与动态路由
  • 带你玩转Python爬虫(胆小者勿进)千万别做坏事·······
  • 明明有index.jsp文件访问的时候却显示404
  • 指针C语言基础代码总结
  • 图嵌入 Node2Vec
  • 前端开发必看100道大厂面试题集锦(一)
  • 网站怎么接入chatGPT来自动写文章
  • python【反爬、xpath解析器、代理ip】