热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

QSS自定义属性

1.基本使用(参见Qt文档页章节SettingQObjectProperties:https:doc.qt.ioqt-5stylesheet-synt

1.基本使用

(参见 Qt 文档页章节 Setting QObject Properties:https://doc.qt.io/qt-5/stylesheet-syntax.html)

从 Qt 4.3 及更高版本开始,可以使用 qproperty- <属性名称> 语法设置任何 designable 的 Q_PROPERTY ,QWidget 派生类支持该语法,仅继承 QObject 不会生效。使用该机制可以很方便的扩展我们的程序。

如我们给自己的窗口加上属性:

class MainWindow : public QMainWindow
{Q_OBJECTQ_PROPERTY(int id READ getId WRITE setId)Q_PROPERTY(QString name READ getName WRITE setName)//... ...
}

就可以在 QSS 样式表中这样赋值:

(QString 类型的貌似不能空格分隔,而且不能和颜色值之类的冲突)

MainWindow{
qproperty-id:10;
qproperty-name:gongjianbo-1992;
}

如果我们在属性的 set 函数中打印的话,是可以看到对应输出的:

一些常用的类型对应的 QSS 写法:

/* QIcon QImage 等 */
MyLabel { qproperty-pixmap: url(pixmap.png); }/* QColor */
MyGroupBox { qproperty-titleColor: rgb(100, 200, 100); }MyPushButton {
/* QSize */
qproperty-iconSize: 20px 20px;/* QRect */
qproperty-myrect:rect(10 20 100 50); /* QBrush 之渐变色 */
qproperty-mycolor:qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 rgba(0, 0, 0, 255), stop:1 rgba(255, 255, 255, 255));
}

2.注意事项

如果该属性引用用 Q_ENUMS 声明的枚举,则应按名称(而不是其数值)引用其常量。

请谨慎使用 qproperty 语法,因为它会修改正在绘制的小部件。

qproperty 语法仅计算一次,即用样式修饰小部件时。这意味着在伪状态(例如 QPushButton:hover)中使用它们的任何尝试都将无效。但是我们可以给非伪状态重新设置属性值。

如果使用 QString 类型,不要和 QColor 之类的属性值冲突,并且中间不要有分隔。

对于渐变色,可以用 QBrush 类接收。

(2020-6-6补充)正数赋值直接写数字就行,负数测试发现需要加字符串引号。


3.样式表与枚举

(2020-6-6补充)对于自定义属性的枚举值,赋值操作使用字符串:

class MyLabel : public QLabel
{Q_OBJECTQ_ENUMS(MyColor)Q_PROPERTY(MyColor color READ getColor WRITE setColor)
public:enum MyColor{Green=1,Yellow=2,Red=3};//... ...
}

/*类选择器*/
.MyLabel{
/*这里有作用域是因为我枚举是声明在MyLabel类里的*/
qproperty-color:"MyLabel::Red";
}

 对于属性选择器中的枚举值,赋值使用枚举对应常量的字符串:

.MyLabel[color="1"]{
background:green;
}
.MyLabel[color="2"]{
background:yellow;
}
.MyLabel[color="3"]{
background:red;
}

经测试 Q_ENUMS 和 Q_ENUM 注册的枚举是一样的写法,虽然 QDebug 打印的时候前者是常量后者是枚举字符串。(Q_ENUMS 和 Q_ENUM 可以参见文档,以及相关资料:https://woboq.com/blog/q_enum.html) 


4.相关源码片段

属性解析相关

//E:\Qt\qt-everywhere-src-5.15.0\qtbase\src\widgets\styles\qstylesheetstyle.cpp

(可以看到一些支持的基本类型)

void QStyleSheetStyle::setProperties(QWidget *w)
{// The final occurrence of each property is authoritative.// Set value for each property in the order of property final occurrence// since properties interact.const QVector decls = declarations(styleRules(w), QString());QVector finals; // indices in reverse order of each property&#39;s final occurrence{// scan decls for final occurrence of each "qproperty"QSet propertySet;for (int i = decls.count() - 1; i >= 0; --i) {const QString property = decls.at(i).d->property;if (!property.startsWith(QLatin1String("qproperty-"), Qt::CaseInsensitive))continue;if (!propertySet.contains(property)) {propertySet.insert(property);finals.append(i);}}}for (int i = finals.count() - 1; i >= 0; --i) {const Declaration &decl = decls.at(finals[i]);QString property = decl.d->property;property.remove(0, 10); // strip "qproperty-"const QMetaObject *metaObject = w->metaObject();int index = metaObject->indexOfProperty(property.toLatin1());if (Q_UNLIKELY(index == -1)) {qWarning() <property(index);if (Q_UNLIKELY(!metaProperty.isWritable() || !metaProperty.isDesignable())) {qWarning() <property(property.toLatin1());switch (value.userType()) {case QMetaType::QIcon: v = decl.iconValue(); break;case QMetaType::QImage: v = QImage(decl.uriValue()); break;case QMetaType::QPixmap: v = QPixmap(decl.uriValue()); break;case QMetaType::QRect: v = decl.rectValue(); break;case QMetaType::QSize: v = decl.sizeValue(); break;case QMetaType::QColor: v = decl.colorValue(); break;case QMetaType::QBrush: v = decl.brushValue(); break;
#ifndef QT_NO_SHORTCUTcase QMetaType::QKeySequence: v = QKeySequence(decl.d->values.at(0).variant.toString()); break;
#endifdefault: v = decl.d->values.at(0).variant; break;}w->setProperty(property.toLatin1(), v);}
}

渐变色解析

//E:\Qt\qt-everywhere-src-5.15.0\qtbase\src\gui\text\qcssparser.cpp

static BrushData parseBrushValue(const QCss::Value &v, const QPalette &pal)
{ColorData c = parseColorValue(v);if (c.type == ColorData::Color) {return QBrush(c.color);} else if (c.type == ColorData::Role) {return c.role;}if (v.type != Value::Function)return BrushData();QStringList lst = v.variant.toStringList();if (lst.count() != 2)return BrushData();QStringList gradFuncs;gradFuncs < vars;QVector stops;int spread = -1;QStringList spreads;spreads <}

 


推荐阅读
  • 第一步:PyQt4Designer设计程序界面该部分设计类同VisvalStudio内的设计,改下各部件的objectName!设计 ... [详细]
  • 本文介绍了pack布局管理器在Perl/Tk中的使用方法及注意事项。通过调用pack()方法,可以控制部件在显示窗口中的位置和大小。同时,本文还提到了在使用pack布局管理器时,应注意将部件分组以便在水平和垂直方向上进行堆放。此外,还介绍了使用Frame部件或Toplevel部件来组织部件在窗口内的方法。最后,本文强调了在使用pack布局管理器时,应避免在中间切换到grid布局管理器,以免造成混乱。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • Java图形化计算器设计与实现
    本文介绍了使用Java编程语言设计和实现图形化计算器的方法。通过使用swing包和awt包中的组件,作者创建了一个具有按钮监听器和自定义界面尺寸和布局的计算器。文章还分享了在图形化界面设计中的一些心得体会。 ... [详细]
  • 颜色迁移(reinhard VS welsh)
    不要谈什么天分,运气,你需要的是一个截稿日,以及一个不交稿就能打爆你狗头的人,然后你就会被自己的才华吓到。------ ... [详细]
author-avatar
LXY520TB_194
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有