版权声明:进步始于交流,收获源于分享!纯正开源之美,有趣、好玩、靠谱。。。作者:一去丶二三里 博客地址:http://blog.csdn.net/liang19890820

 

目录(?)[+]

 

简述

Qt之QSS(Q_PROPERTY-原始属性)一节我们分享了Q_PROPERTY-原始属性的用法,但通常情况下我们需要很多自定义样式,例如:动态获取QSS样式,这时自定义属性就能很好的发挥其用武之地了。

问题

在使用QAbstractItemModel、QAbstractItemDelegate更新表格样式的时候,比如:背景色、前景色等,我们通常的做法是定义一些颜色常量,然后根据不同的条件显示不同的颜色,要么就是通过QSS全局设置,让所有的背景色、前景色保持一致。

这有一个问题,局限性太强,无法动态获取颜色值,大大降低了程序的扩展性。

解决方案

QAbstractItemModel、QAbstractItemDelegate均继承自QObject,而QSS只能用于QWidget及其子孙类,那么,如何动态获取样式属性值呢?

三部曲:

  • 创建一个从QWidget继承的专用类StyledWidget。
  • 为StyledWidget添加自定义属性,并使用Q_PROPERTY声明
  • 自定义QSS,使用自定义属性,语法:qproperty-<property name>

其中,Q_PROPERTY声明有以下要求:

  • READ getFunction 
    用于读取属性,使用const限定,返回属性的类型或者类型的指针或引用。

  • WRITE setFunction 
    用于设置属性,参数是一个属性的类型,或者属性的const指针或引用,返回

实例

效果

源码

创建一个从QWidget继承的专用类StyledWidget,为其添加自定义属性,并使用Q_PROPERTY声明:

StyledWidget.h

#ifndef STYLED_WIDGET
#define STYLED_WIDGET #include <QWidget> class StyledWidget : public QWidget
{
Q_OBJECT
Q_PROPERTY(QColor normalColor READ normalColor WRITE setNormalColor DESIGNABLE true)
...
public:
explicit StyledWidget(QWidget *parent = 0);
~StyledWidget(); QColor normalColor() const;
void setNormalColor(QColor color);
... private:
QColor m_normalColor;
...
}; #endif // STYLED_WIDGET
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

StyledWidget.cpp

...
QColor StyledWidget::normalColor() const
{
return m_normalColor;
} void StyledWidget::setNormalColor(QColor color)
{
m_normalColor = color;
}
...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

QSS

QSS中使用自定义的属性设置对应的样式:

StyledWidget {
qproperty-normalColor: white;
qproperty-disableColor: gray;
qproperty-highlightColor: rgb(0, 160, 230);
qproperty-errorColor: red;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

使用

在需要设置样式的类中声明StyledWidget:

class TableModel : public QAbstractTableModel
{
Q_OBJECT public:
...
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
...
private:
...
StyledWidget m_styledWidget;
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

使用自定义属性设置样式:

QVariant TableModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant(); switch (role)
{
case Qt::TextColorRole:
{
if (index.column() == FILE_NAME_COLUMN)
return m_styledWidget.normalColor(); if (index.column() == SIZE_COLUMN)
return m_styledWidget.highlightColor(); if (index.column() == STATUS_COLUMN)
return m_styledWidget.errorColor();
}
...
}
return QVariant();
}

Qt之QSS(Q_PROPERTY-自定义属性)的更多相关文章

  1. Qt之QSS(动态属性)

    简述 QSS可以定制应用程序的外观,无需关注Qt样式背后的魔力.从非常轻微到极其复杂的调整,样式表都可以做到.对于一个完全定制和独特的用户体验,QtQuick和QGraphicsView是更好的选择. ...

  2. Qt之QSS(Q_PROPERTY-原始属性)

    http://blog.csdn.net/liang19890820/article/details/51698536 版权声明:进步始于交流,收获源于分享!纯正开源之美,有趣.好玩.靠谱...作者: ...

  3. Qt之QSS(白色靓丽)

    简述 Qt助手中有关于各种部件的QSS详细讲解,资源很丰富,请参考:Qt Style Sheets Examples. 白色靓丽 - 一款漂亮的QSS风格. 你可以直接使用,也可以随意转载,但请务必保 ...

  4. Qt之QSS(黑色炫酷)

    简述 Qt助手中有关于各种部件的QSS详细讲解,资源很丰富,请参考:Qt Style Sheets Examples. 黑色炫酷 - 一款漂亮的QSS风格. 之前博客中分享了很多关于Qt的样式效果,几 ...

  5. Qt之QSS(QDarkStyleSheet)

    简述 关于样式,前面介绍了很多内容,下面分享一个深色样式表,很值得借鉴! 简述 效果 QSS 更多参考 效果 QSS /* * The MIT License (MIT) * * Copyright ...

  6. Qt的Qss样式

    http://www.cnblogs.com/coffeegg/archive/2011/11/15/2249452.html(转) http://blog.csdn.net/cgzhello1/ar ...

  7. Qt之QSS(语法高亮)

    简述 语法高亮是文本编辑器用来显示文本的,特别是源代码,根据不同的类别来用不同的颜色和字体显示.这个功能有助于编写结构化的语言,例如:编程语言.标记语言,这些语言的语法错误显示是有区别的. 简述 详细 ...

  8. Qt 之 QSS(样式表语法)

    https://blog.csdn.net/liang19890820/article/details/51691212 简述 Qt样式表(以下统称QSS)的术语和语法规则几乎和CSS相同.如果你熟悉 ...

  9. Qt之QSS(样式表语法)

    http://blog.csdn.net/liang19890820/article/details/51691212 版权声明:进步始于交流,收获源于分享!纯正开源之美,有趣.好玩.靠谱...作者: ...

随机推荐

  1. HDU 6351 (带技巧的暴力)

    题意:给定一个数,和一个最多交换次数k,问在不超过k次操作的情况,问可以得到的最大值和最小值是多少? 个人解题的艰辛路程 , 开始是想到了暴力枚举的可能 , 打出来发现在判断枚举的数组与原来数组交换了 ...

  2. C# B站的弹幕提取

    要知道B站的弹幕位置 如果只考虑视频,B站的链接格式为:https://www.bilibili.com/video/av34042815.把av后面的数字看做是唯一标记即可. 既然能够把弹幕加载出来 ...

  3. 【总结】ettercap工具之DNS劫持

    在arp欺骗成功基础上开始进行dns劫持,,, 1.修改/etc/ettercap/etter.dns文件内容,如下图所示. 将所有域名解析到192.168.1.250地址上,,, 2.etterca ...

  4. WPF 使用第三方ttf字体

    1.将字体文件直接添加到项目中,注意:将文件的“属性”--“生成操作”设置为“Resource” 2.在Xaml中使用,text可以使用文字或直接使用unicode编码,XAML中使用Unicode编 ...

  5. PIE SDK图层属性

    1. 功能简介 通过查看图层属性可以对图层的基本信息(一般信息,来源,注释,字段信息等)有所了解 ,下面就基于PIE SDK,介绍查看图层属性功能的实现. 2. 功能实现说明 2.1. 实现思路及原理 ...

  6. 授权过期后AJAX操作跳转到登录页的一种全局处理方式

    前两天园友JustRun分享了一篇 <菜鸟程序员之Asp.net MVC Session过期异常的处理>博文,正好自己前段时间被安排处理过这个问题,发现JustRun的方法有一点点可优化的 ...

  7. win 引用win32无效问题

    我使用pycharm 安装: python window 10 下安装win32 module 问题:安装后引用win32api等依赖,无效,但是目录下确实已经安装: 解决方案: ${python_h ...

  8. pip install xxx -i https://pypi.tuna.tsinghua.edu.cn/simple

    pip install xxx -i https://pypi.tuna.tsinghua.edu.cn/simple 快速下载

  9. pat1014. Waiting in Line (30)

    1014. Waiting in Line (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Suppo ...

  10. Oracle服务器重命名

    转载自:http://www.codesec.net/view/120387.html 因工作需要准备了一台服务器专门按照oracle数据库,并且服务器上安装了windows 2008R2操作系统,在 ...