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