1. 程式人生 > 實用技巧 >QStyle Check Boxes 示例(七)

QStyle Check Boxes 示例(七)

QCheckBox構建樣式選項,即複選框的QStyleOptionButton:

  opt.initFrom(q);
         if (down)
         opt.state |= QStyle::State_Sunken;
     if (tristate && noChange)
         opt.state |= QStyle::State_NoChange;
     else
         opt.state |= checked ? QStyle::State_On :
         QStyle::State_Off;
     if (q->testAttribute(Qt::WA_Hover) &&  q->underMouse()) {
         if (hovering)
         opt.state |= QStyle::State_MouseOver;
         else
         opt.state &= ~QStyle::State_MouseOver;
     }
     opt.text = text;
     opt.icon = icon;
     opt.iconSize = q->iconSize();


首先,我們讓QStyleOption使用initFrom()設定所有小部件共有的資訊。
當用戶按下框時,down boolean為true;否則,為false。 無論是否選中該複選框,都是如此。
當我們具有三態複選框時,將設定State_NoChange狀態,並對其進行部分檢查。 如果選中此框,則具有State_On;如果未選中,則具有State_Off。
如果滑鼠懸停在複選框上方且視窗小部件具有屬性Qt :: WA_Hover設定,則會設定State_MouseOver-您可以在QStyle :: polish()中進行設定。
此外,樣式選項還包含按鈕的文字,圖示和圖示大小。
initFrom()使用所有小部件的公共屬性設定樣式選項。 我們在此處列印其實現:
     state = QStyle::State_None;
     if (widget->isEnabled())
         state |= QStyle::State_Enabled;
     if (widget->hasFocus())
         state |= QStyle::State_HasFocus;
     if (widget->window()->testAttribute(Qt::WA_KeyboardFocusChange))
         state |= QStyle::State_KeyboardFocusChange;
     if (widget->underMouse())
         state |= QStyle::State_MouseOver;
     if (widget->window()->isActiveWindow())
         state |= QStyle::State_Active;
 #ifdef Q_WS_MAC
     extern bool qt_mac_can_clickThrough(const QWidget *w); //qwidget_mac.cpp
     if (!(state & QStyle::State_Active) && !qt_mac_can_clickThrough(widget))
         state &= ~QStyle::State_Enabled;
 #endif
 #ifdef QT_KEYPAD_NAVIGATION
     if (widget->hasEditFocus())
         state |= QStyle::State_HasEditFocus;
 #endif

     direction = widget->layoutDirection();
     rect = widget->rect();
     palette = widget->palette();
     fontMetrics = widget->fontMetrics();

啟用小部件時設定State_Enabled。 當視窗小部件具有焦點時,將設定State_HasFocus標誌。

同樣,當小部件是活動視窗的子級時,設定State_Active標誌。 僅當視窗小部件設定了WA_HoverEnabled Windows標誌時,才設定State_MouseOver。

請注意,必須在Qt中啟用小鍵盤導航,才能包含State_HasEditFocus。 預設情況下不包含它。

除了設定狀態標誌之外,QStyleOption還包含有關小部件的其他資訊:

direction是佈局的佈局方向,rect是小部件的邊界矩形(繪製區域),palette是應用於以下用途的QPalette 繪製視窗小部件,fontMetrics是視窗小部件使用的字型的度量。

我們提供一個複選框影象和與之匹配的樣式選項。