Qt之QSS(Q_PROPERTY-自定义属性)
2016-06-17 13:05
603 查看
简述
在Qt之QSS(Q_PROPERTY-原始属性)一节我们分享了Q_PROPERTY-原始属性的用法,但通常情况下我们需要很多自定义样式,例如:动态获取QSS样式,这时自定义属性就能很好的发挥其用武之地了。简述
问题
解决方案
实例
效果
源码
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
StyledWidget.cpp
... QColor StyledWidget::normalColor() const { return m_normalColor; } void StyledWidget::setNormalColor(QColor color) { m_normalColor = color; } ...
QSS
QSS中使用自定义的属性设置对应的样式:StyledWidget { qproperty-normalColor: white; qproperty-disableColor: gray; qproperty-highlightColor: rgb(0, 160, 230); qproperty-errorColor: red; }
使用
在需要设置样式的类中声明StyledWidget:class TableModel : public QAbstractTableModel { Q_OBJECT public: ... QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; ... private: ... StyledWidget m_styledWidget; };
使用自定义属性设置样式:
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文件Qt之QSS(语法高亮)
Qt之QSS(样式表语法)
Qt之QSS(动态属性)
Qt之QSS(Q_PROPERTY-原始属性)
Qt之QSS(QDarkStyleSheet)
Qt之QSS(黑色炫酷)
Qt之QSS(白色靓丽)
Qt之界面换肤
相关文章推荐
- QT学习 第一章:基本对话框
- 使用Shiboken为C++和Qt库创建Python绑定
- Qt 5.6更新至RC版,最终版本近在咫尺
- Qt定时器和随机数详解
- Qt实现图片移动实例(图文教程)
- Qt for Android开发实例教程
- QModelIndex/Role/Model介紹<二>
- Qt Model/View/Delegate浅谈 - QAbstractListModel
- Qt Model/View/Delegate浅谈 - roleNames()
- QT历程(一):与CryptoJs对应的AES加密
- 基于PyQt5的快速开发框架QFramer
- OSX下安装PyQt
- ok6410开发板移植DirectFB手记
- 【笔记】给Qt内嵌一个Chrome吧
- 【算法】最短路径之A*搜索
- qt入门必备
- 在 Qt4 中使用 C++11
- Hello Word ~ v0.2.2 背单词软件发布 -- By WHYPRO
- ubuntu下opencv和qt的安装配置
- linux下opengl的安装(with qt)