Qt之QSS(QTreeView)

简述

QTreeView 作为一个树形控件,我们经常用到,只要对样式熟悉,可以做出特别漂亮的特效。

  • 简述
  • 自定义 QTreeView
  • 指示器
  • 整行拓展

自定义 QTreeView

交替行的背景色可以使用下面样式代码来定义:

QTreeView {
    alternate-background-color: yellow;
}

当鼠标划过 item 时,如果要提供一个特殊的背景色,可以使用 ::item 辅助控制,例如:

QTreeView {
    show-decoration-selected: 1;
}

QTreeView::item {
    border: 1px solid #d9d9d9;
    border-top-color: transparent;
    border-bottom-color: transparent;
}

QTreeView::item:hover {
    background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #e7effd, stop: 1 #cbdaf1);
    border: 1px solid #bfcde4;
}

QTreeView::item:selected {
    border: 1px solid #567dbc;
}

QTreeView::item:selected:active{
    background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #6ea1f1, stop: 1 #567dbc);
}

QTreeView::item:selected:!active {
    background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #6b9be8, stop: 1 #577fbf);
}

QTreeView 的分支可以使用 ::branch 辅助控制。当绘制一个 branch 时,下述的样式颜色实现了一系列状态。

QTreeView::branch {
    background: palette(base);
}

QTreeView::branch:has-siblings:!adjoins-item {
    background: cyan;
}

QTreeView::branch:has-siblings:adjoins-item {
    background: red;
}

QTreeView::branch:!has-children:!has-siblings:adjoins-item {
    background: blue;
}

QTreeView::branch:closed:has-children:has-siblings {
    background: pink;
}

QTreeView::branch:has-children:!has-siblings:closed {
    background: gray;
}

QTreeView::branch:open:has-children:has-siblings {
    background: magenta;
}

QTreeView::branch:open:has-children:!has-siblings {
    background: green;
}

尽管它比较丰富多彩,但可以用下面的图片实现一个更有用的效果:

图片 路径
vline.png
branch-more.png
branch-end.png
branch-closed.png
branch-open.png
QTreeView::branch:has-siblings:!adjoins-item {
    border-image: url(vline.png) 0;
}

QTreeView::branch:has-siblings:adjoins-item {
    border-image: url(branch-more.png) 0;
}

QTreeView::branch:!has-children:!has-siblings:adjoins-item {
    border-image: url(branch-end.png) 0;
}

QTreeView::branch:has-children:!has-siblings:closed,
QTreeView::branch:closed:has-children:has-siblings {
    border-image: none;
    image: url(branch-closed.png);
}

QTreeView::branch:open:has-children:!has-siblings,
QTreeView::branch:open:has-children:has-siblings  {
    border-image: none;
    image: url(branch-open.png);
}

由此产生的 Tree 视图看起来像这样:

指示器

如果我们对 Tree 需要添加指示器,需要用过 ::indicator 辅助控制:

QTreeView {
        border: 1px solid rgb(50, 50, 50);
        background-color: rgb(57, 58, 60);
        font-size: 16px;
}
QTreeView::item {  /** item **/
        height: 25px;
        color: white;
        border: none;
        border-bottom: 1px solid rgb(50, 50, 50);
        background-color: transparent;
}
QTreeView::item:hover { /** 鼠标滑过 item **/
        background-color: rgba(255, 255, 255, 40);
}
QTreeView::item:selected { /** 鼠标选中 item **/
        background-color: rgb(0, 160, 230);
}
QTreeView::branch:open:has-children {  /** 分支 - 展开 item(有孩子) **/
        image: url(:/Images/arrowBottom);
}
QTreeView::branch:closed:has-children { /** 分支 - 折叠 item(无孩子) **/
        image: url(:/Images/arrowRight);
}
QTreeView::indicator {  /** 指示器 **/
        width: 20px;
        height: 20px;
}
QTreeView::indicator:enabled:unchecked {  /** 指示器 - 未选中 **/
        image: url(:/Images/checkBox);
}
QTreeView::indicator:enabled:unchecked:hover {
        image: url(:/Images/checkBoxHover);
}
QTreeView::indicator:enabled:unchecked:pressed {
        image: url(:/Images/checkBoxPressed);
}
QTreeView::indicator:enabled:checked {  /** 指示器 - 选中 **/
        image: url(:/Images/checkBoxChecked);
}
QTreeView::indicator:enabled:checked:hover {
        image: url(:/Images/checkBoxCheckedHover);
}
QTreeView::indicator:enabled:checked:pressed {
        image: url(:/Images/checkBoxCheckedPressed);
}
QTableView::indicator:enabled:indeterminate {  /** 指示器 - 半选 **/
        image: url(:/Images/checkBoxIndeterminate);
}
QTreeView::indicator:enabled:indeterminate:hover {
        image: url(:/Images/checkBoxIndeterminateHover);
}
QTreeView::indicator:enabled:indeterminate:pressed {
        image: url(:/Images/checkBoxIndeterminatePressed);
}

整行拓展

由上面分析,如果要整行拓展,可以将 item 和 branch 相同状态(正常、划过、选中)下的背景设置相同。

QTreeView {
        border: 1px solid rgb(50, 50, 50);
        background-color: rgb(57, 58, 60);
}
QTreeView::item {
        height: 25px;
        color: white;
        border: none;
        background-color: transparent;
}
QTreeView::item:hover, QTreeView::branch:hover { /** 鼠标滑过 **/
        background-color: rgba(255, 255, 255, 40);
}
QTreeView::item:selected, QTreeView::branch:selected { /** 鼠标选中 **/
        background-color: rgb(0, 160, 230);
}
QTreeView::branch {
        background-color: transparent;
}
QTreeView::branch:open:has-children {
        image: url(:/Images/arrowBottom);
}
QTreeView::branch:closed:has-children {
        image: url(:/Images/arrowRight);
}

O__O”…,看似大功告成,可万万没想到:

当鼠标选中的时候可以整行拓展,可是当鼠标滑过。。。无语中!

没关系,其实 Qt 关于盒模型的介绍说的很清楚,不妨添加如下代码试试:

QTreeView {
    show-decoration-selected: 1;
}

注意:在之前代码的基础上,只需再添加这一行即可。

再来看一下效果:

show-decoration-selected 属性控制选中时是选中整项还是仅仅只是项的文本,而辅助控制(子组件) ::branch::item 用于精细化控制。

时间: 2024-12-25 19:46:55

Qt之QSS(QTreeView)的相关文章

Qt之QSS(QDarkStyleSheet)

简述 关于样式,前面介绍了很多内容,下面分享一个深色样式表,很值得借鉴! 简述 效果 QSS 更多参考 效果 QSS /* * The MIT License (MIT) * * Copyright (c) <2013-2014> <Colin Duquesnoy> * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and assoc

Qt之QSS(样式表语法)

简述 Qt样式表以下统称QSS的术语和语法规则几乎和CSS相同.如果你熟悉CSS可以快速浏览以下内容. 简述 样式规则 选择器类型 子控件 伪选择器 解决冲突 级联效应 继承性 Namespaces中的部件 设置对象属性 更多参考 样式规则 QSS包含了一个样式规则序列一个样式规则由一个选择器和声明组成选择器指定哪些部件由规则影响声明指定哪些属性应该在部件上进行设置.例如 QPushButton { color: red } 上面的例子中QPushButton是选择器{ color: red }

属性设置-Qt中QSS,对于各个控件的设置,各个属性都代表什么意思?

问题描述 Qt中QSS,对于各个控件的设置,各个属性都代表什么意思? Qt中QSS,对于各个控件的设置,各个属性都代表什么意思? 比如,设置QComboBox:down-arrow{...}.这个语句中,找了好久才找到down-arrow代表什么意思... 有没有系统的对各个控件属性的介绍? 解决方案 查看qt的文档,或者google下.

Qt之QSS(语法高亮)

简述 语法高亮是文本编辑器用来显示文本的,特别是源代码,根据不同的类别来用不同的颜色和字体显示.这个功能有助于编写结构化的语言,例如:编程语言.标记语言,这些语言的语法错误显示是有区别的. 简述 详细描述 配置 高亮 更多参考 详细描述 语法高亮能帮助开发者很快的找到程序中的错误.例如,大部分编辑器会用不同的颜色突出字符串常量.所以,非常容易发现是否遗漏了分隔符,因为相对于其他文本颜色不同. Qt Creator 中默认情况下打开 qss 文件(*.qss)不会高亮显示,需要手动配置,让其更符合

Qt之QSS(Q_PROPERTY-原始属性)

简述 在Qt之QSS(样式表语法)一节讲过关于"设置对象属性"的用法,里面有一条很重要的原则是:任何可被识别的Q_PROPERTY都可以使用qproperty-语法设置. 这里需要对Qt属性系统有一定的了解,详见助手:The Property System. 简述 属性 实例 效果 QSS 源码 更多参考 属性 下面我们以QLabel为例,讲解如何在QSS中使用属性. class Q_WIDGETS_EXPORT QLabel : public QFrame { ... Q_PROPE

Qt之QSS(Q_PROPERTY-自定义属性)

简述 在Qt之QSS(Q_PROPERTY-原始属性)一节我们分享了Q_PROPERTY-原始属性的用法,但通常情况下我们需要很多自定义样式,例如:动态获取QSS样式,这时自定义属性就能很好的发挥其用武之地了. 简述 问题 解决方案 实例 效果 源码 QSS 使用 更多参考 问题 在使用QAbstractItemModel.QAbstractItemDelegate更新表格样式的时候,比如:背景色.前景色等,我们通常的做法是定义一些颜色常量,然后根据不同的条件显示不同的颜色,要么就是通过QSS全

Qt之QSS(动态属性)

简述 QSS可以定制应用程序的外观,无需关注Qt样式背后的魔力.从非常轻微到极其复杂的调整,样式表都可以做到.对于一个完全定制和独特的用户体验,QtQuick和QGraphicsView是更好的选择. 简述 自定义属性 限制 示例 效果 源码 QSS 更多参考 自定义属性 为了用户界面外观的动态变化,属性选择器可以与动态属性组合使用.动态属性在Qt4.2中引入,允许为编译时不存在的QObject属性分配属性值.即:如果为QObject设置一个urgent属性为true,该属性将跟随该类,但不会为

Qt之QSS(白色靓丽)

简述 Qt助手中有关于各种部件的QSS详细讲解,资源很丰富,请参考:Qt Style Sheets Examples. 白色靓丽 - 一款漂亮的QSS风格. 你可以直接使用,也可以随意转载,但请务必保留版权声明和许可声明,请参考"声明"部分. 简述 声明 效果 QSS 更多参考 声明 被授权人权利 被授权人有权利使用.复制.修改.合并.出版发行.散布.再授权及贩售软件及软件的副本. 被授权人可根据程序的需要修改授权条款为适当的内容. 被授权人义务 在软件和软件的所有副本中都必须包含版权

Qt之QSS(黑色炫酷)

简述 Qt助手中有关于各种部件的QSS详细讲解,资源很丰富,请参考:Qt Style Sheets Examples. 黑色炫酷 - 一款漂亮的QSS风格. 之前博客中分享了很多关于Qt的样式效果,几乎都是基下面此样式. 你可以直接使用,也可以随意转载,但请务必保留版权声明和许可声明,请参考"声明"部分. 简述 声明 效果 QSS 更多参考 声明 被授权人权利 被授权人有权利使用.复制.修改.合并.出版发行.散布.再授权及贩售软件及软件的副本. 被授权人可根据程序的需要修改授权条款为适