QStyle Check Boxes 示例(七)
阿新 • • 發佈:2020-11-04
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是視窗小部件使用的字型的度量。
我們提供一個複選框影象和與之匹配的樣式選項。