QStyle QStyleOption 樣式選項(四)


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




免責聲明!

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



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