Qt之QSS(Q_PROPERTY-自定義屬性)


 

目錄(?)[+]

 

簡述

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(); }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM