QStyleOption的子類包含樣式各個元素所需的所有信息。樣式選項被實例化-通常在堆棧上-並由QStyle函數的調用者填寫。
根據所繪制的內容,樣式將期望使用不同的樣式選項類。例如,QStyle :: PE_FrameFocusRect元素需要一個QStyleOptionFocusRect參數,
並且可以創建自定義樣式可以使用的自定義子類。出於性能原因,樣式選項保留公共變量。
這些小部件可以處於多個不同的狀態,這些狀態由State枚舉定義。
某些狀態標志根據窗口小部件具有不同的含義,但其他狀態標志對於所有窗口小部件(例如State_Disabled)都是通用的。
QStyleOption使用QStyleOption :: initFrom();設置公共狀態。其余狀態由各個小部件設置。
最值得注意的是,樣式選項包含要繪制的小部件的調色板和邊界矩形。大多數小部件都有專門的樣式選項。
例如,QPushButton和QCheckBox使用QStyleOptionButton作為樣式選項,其中包含文本,圖標和圖標大小。當我們瀏覽各個小部件時,將描述所有選項的確切內容。
重新實現帶有QStyleOption參數的QStyle函數時,通常需要將QStyleOption強制轉換為子類(例如QStyleOptionFocusRect)。
為了安全起見,可以使用qstyleoption_cast()來確保指針類型正確。如果對象的類型不正確,則qstyleoption_cast()返回0。
例如:
const QStyleOptionFocusRect *focusRectOption = qstyleoption_cast<const QStyleOptionFocusRect *>(option);
if (focusRectOption) {
...
}
以下代碼段說明了如何使用QStyle從自定義小部件的paintEvent()繪制焦點矩形:
void MyWidget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
...
QStyleOptionFocusRect option(1);
option.init(this);
option.backgroundColor = palette().color(QPalette::Window);
style().drawPrimitive(QStyle::PE_FrameFocusRect, &option, &painter,
this);
}
下一個示例顯示如何從現有樣式派生以定制圖形元素的外觀:
class CustomStyle : public QWindowsStyle
{
Q_OBJECT
public:
CustomStyle()
~CustomStyle() {}
void drawPrimitive(PrimitiveElement element, const QStyleOption *option,
QPainter *painter, const QWidget *widget) const;
};
void CustomStyle::drawPrimitive(PrimitiveElement element, const QStyleOption *option,
QPainter *painter, const QWidget *widget) const
{
if (element == PE_IndicatorSpinUp || element == PE_IndicatorSpinDown) {
QPolygon points(3);
int x = option->rect.x();
int y = option->rect.y();
int w = option->rect.width() / 2;
int h = option->rect.height() / 2;
x += (option->rect.width() - w) / 2;
y += (option->rect.height() - h) / 2;
if (element == PE_IndicatorSpinUp) {
points[0] = QPoint(x, y + h);
points[1] = QPoint(x + w, y + h);
points[2] = QPoint(x + w / 2, y);
} else { // PE_SpinBoxDown
points[0] = QPoint(x, y);
points[1] = QPoint(x + w, y);
points[2] = QPoint(x + w / 2, y + h);
}
if (option->state & State_Enabled) {
painter->setPen(option->palette.mid().color());
painter->setBrush(option->palette.buttonText());
} else {
painter->setPen(option->palette.buttonText().color());
painter->setBrush(option->palette.mid());
}
painter->drawPolygon(points);
} else {
QWindowsStyle::drawPrimitive(element, option, painter, widget);
}
}
