📄 qstylesheetstyle.cpp
字号:
{ QStyle::SC_None, "icon" }, { QStyle::SC_None, "right-arrow" }, { QStyle::SC_None, "branch" }, { QStyle::SC_None, "section" }, { QStyle::SC_None, "down-arrow" }, { QStyle::SC_None, "up-arrow" }, { QStyle::SC_None, "chunk" }, { QStyle::SC_None, "tab" }, { QStyle::SC_None, "scroller" }, { QStyle::SC_None, "tear" }, { QStyle::SC_SliderGroove, "groove" }, { QStyle::SC_SliderHandle, "handle" }, { QStyle::SC_None, "add-page" }, { QStyle::SC_None, "sub-page"}, { QStyle::SC_SliderTickmarks, "tick-mark" }, { QStyle::SC_None, "pane" }, { QStyle::SC_None, "tab-bar" }, { QStyle::SC_None, "left-corner" }, { QStyle::SC_None, "right-corner" }};QVector<Declaration> declarations(const QVector<StyleRule> &styleRules, const QString &part, int pseudoClass = PseudoClass_Unspecified){ QVector<Declaration> decls; for (int i = 0; i < styleRules.count(); i++) { const Selector& selector = styleRules.at(i).selectors.at(0); // Rules with pseudo elements don't cascade. This is an intentional // diversion for CSS if (part.compare(selector.pseudoElement(), Qt::CaseInsensitive) != 0) continue; int negated = 0; int cssClass = selector.pseudoClass(&negated); if ((cssClass == PseudoClass_Unspecified) || ((((cssClass & pseudoClass) == cssClass)) && ((negated & pseudoClass) == 0))) decls += styleRules.at(i).declarations; } return decls;}int QStyleSheetStyle::nativeFrameWidth(const QWidget *w){ QStyle *base = baseStyle();#ifndef QT_NO_SPINBOX if (qobject_cast<const QAbstractSpinBox *>(w)) return base->pixelMetric(QStyle::PM_SpinBoxFrameWidth, 0, w);#endif#ifndef QT_NO_COMBOBOX if (qobject_cast<const QComboBox *>(w)) return base->pixelMetric(QStyle::PM_ComboBoxFrameWidth, 0, w);#endif#ifndef QT_NO_MENU if (qobject_cast<const QMenu *>(w)) return base->pixelMetric(QStyle::PM_MenuPanelWidth, 0, w);#endif#ifndef QT_NO_MENUBAR if (qobject_cast<const QMenuBar *>(w)) return base->pixelMetric(QStyle::PM_MenuBarPanelWidth, 0, w);#endif if (QString::fromLatin1(w->metaObject()->className()) == QLatin1String("QTipLabel")) return base->pixelMetric(QStyle::PM_ToolTipLabelFrameWidth, 0, w); return base->pixelMetric(QStyle::PM_DefaultFrameWidth, 0, w);}static int pseudoClass(QStyle::State state){ int pc = (state & QStyle::State_Enabled) ? PseudoClass_Enabled : PseudoClass_Disabled; if (state & QStyle::State_Sunken) pc |= PseudoClass_Pressed; if (state & QStyle::State_MouseOver) pc |= PseudoClass_Hover; if (state & QStyle::State_HasFocus) pc |= PseudoClass_Focus; if (state & QStyle::State_On) pc |= PseudoClass_On; if (state & QStyle::State_Off) pc |= PseudoClass_Off; if (state & QStyle::State_NoChange) pc |= PseudoClass_Indeterminate; if (state & QStyle::State_Selected) pc |= PseudoClass_Selected; if (state & QStyle::State_Horizontal) pc |= PseudoClass_Horizontal; else pc |= PseudoClass_Vertical; if (state & (QStyle::State_Open | QStyle::State_On | QStyle::State_Sunken)) pc |= PseudoClass_Open; else pc |= PseudoClass_Closed; if (state & QStyle::State_Children) pc |= PseudoClass_Children; if (state & QStyle::State_Sibling) pc |= PseudoClass_Sibling; if (state & QStyle::State_ReadOnly) pc |= PseudoClass_ReadOnly; if (state & QStyle::State_Item) pc |= PseudoClass_Item; return pc;}QRenderRule QStyleSheetStyle::renderRule(const QWidget *w, int element, int state) const{ if (!w) return QRenderRule(); const QString part = QLatin1String(knownPseudoElements[element].name); if (renderRulesCache->contains(w)) { QHash<int, QRenderRule> &renderRules = (*renderRulesCache)[w][part]; if (renderRules.contains(state)) return renderRules[state]; // already computed before } QVector<Declaration> decls = declarations(styleRules(w), part, state); QRenderRule newRule(decls, w); if (w->property("_q_stylesheet_polished").toBool() == true) (*renderRulesCache)[w][part][state] = newRule; return newRule;}QRenderRule QStyleSheetStyle::renderRule(const QWidget *w, const QStyleOption *opt, int pseudoElement) const{ if (!w) return QRenderRule(); int extraClass = 0; QStyle::State state = opt ? opt->state : QStyle::State(QStyle::State_None); if (const QStyleOptionComplex *complex = qstyleoption_cast<const QStyleOptionComplex *>(opt)) { if (pseudoElement != PseudoElement_None) { // if not an active subcontrol, just pass enabled/disabled QStyle::SubControl subControl = knownPseudoElements[pseudoElement].subControl; if (!(complex->activeSubControls & subControl)) state = QStyle::State(state & (QStyle::State_Enabled | QStyle::State_Horizontal)); } switch (pseudoElement) { case PseudoElement_ComboBoxDropDown: case PseudoElement_ComboBoxArrow: state |= (complex->state & (QStyle::State_On|QStyle::State_ReadOnly)); break; case PseudoElement_SpinBoxUpButton: case PseudoElement_SpinBoxDownButton: case PseudoElement_SpinBoxUpArrow: case PseudoElement_SpinBoxDownArrow:#ifndef QT_NO_SPINBOX if (const QStyleOptionSpinBox *sb = qstyleoption_cast<const QStyleOptionSpinBox *>(opt)) { bool on = false; bool up = pseudoElement == PseudoElement_SpinBoxUpButton || pseudoElement == PseudoElement_SpinBoxUpArrow; if ((sb->stepEnabled & QAbstractSpinBox::StepUpEnabled) && up) on = true; else if ((sb->stepEnabled & QAbstractSpinBox::StepDownEnabled) && !up) on = true; state |= (on ? QStyle::State_On : QStyle::State_Off); }#endif // QT_NO_SPINBOX break; case PseudoElement_GroupBoxTitle: state |= (complex->state & (QStyle::State_MouseOver | QStyle::State_Sunken)); break; case PseudoElement_ToolButtonMenu: case PseudoElement_ToolButtonMenuArrow: case PseudoElement_ToolButtonDownArrow: state |= complex->state & QStyle::State_MouseOver; if (complex->state & QStyle::State_Sunken || complex->activeSubControls & QStyle::SC_ToolButtonMenu) state |= QStyle::State_Sunken; break; case PseudoElement_SliderGroove: state |= complex->state & QStyle::State_MouseOver; break; default: break; } if (const QStyleOptionComboBox *combo = qstyleoption_cast<const QStyleOptionComboBox *>(opt)) { // QStyle::State_On is set when the popup is being shown // Propagate EditField Pressed state if (pseudoElement == PseudoElement_None && (complex->activeSubControls & QStyle::SC_ComboBoxEditField) && (!(state & QStyle::State_MouseOver))) { state |= QStyle::State_Sunken; } if (!combo->frame) extraClass |= PseudoClass_Frameless; if (!combo->editable) extraClass |= PseudoClass_ReadOnly; else extraClass |= PseudoClass_Editable;#ifndef QT_NO_SPINBOX } else if (const QStyleOptionSpinBox *spin = qstyleoption_cast<const QStyleOptionSpinBox *>(opt)) { if (!spin->frame) extraClass |= PseudoClass_Frameless;#endif // QT_NO_SPINBOX } else if (const QStyleOptionGroupBox *gb = qstyleoption_cast<const QStyleOptionGroupBox *>(opt)) { if (gb->features & QStyleOptionFrameV2::Flat) extraClass |= PseudoClass_Flat; if (gb->lineWidth == 0) extraClass |= PseudoClass_Frameless; } } else { // handle simple style options if (const QStyleOptionMenuItem *mi = qstyleoption_cast<const QStyleOptionMenuItem *>(opt)) { if (mi->menuItemType == QStyleOptionMenuItem::DefaultItem) extraClass |= PseudoClass_Default; if (mi->checkType == QStyleOptionMenuItem::Exclusive) extraClass |= PseudoClass_Exclusive; else if (mi->checkType == QStyleOptionMenuItem::NonExclusive) extraClass |= PseudoClass_NonExclusive; if (mi->checkType != QStyleOptionMenuItem::NotCheckable) extraClass |= (mi->checked) ? PseudoClass_Checked : PseudoClass_Unchecked; } else if (const QStyleOptionHeader *hdr = qstyleoption_cast<const QStyleOptionHeader *>(opt)) { if (hdr->position == QStyleOptionHeader::OnlyOneSection) extraClass |= PseudoClass_OnlyOne; else if (hdr->position == QStyleOptionHeader::Beginning) extraClass |= PseudoClass_First; else if (hdr->position == QStyleOptionHeader::End) extraClass |= PseudoClass_Last; else if (hdr->position == QStyleOptionHeader::Middle) extraClass |= PseudoClass_Middle; if (hdr->selectedPosition == QStyleOptionHeader::NextAndPreviousAreSelected) extraClass |= (PseudoClass_NextSelected | PseudoClass_PreviousSelected); else if (hdr->selectedPosition == QStyleOptionHeader::NextIsSelected) extraClass |= PseudoClass_NextSelected; else if (hdr->selectedPosition == QStyleOptionHeader::PreviousIsSelected) extraClass |= PseudoClass_PreviousSelected;#ifndef QT_NO_TABWIDGET } else if (const QStyleOptionTabWidgetFrame *tab = qstyleoption_cast<const QStyleOptionTabWidgetFrame *>(opt)) { switch (tab->shape) { case QTabBar::RoundedNorth: case QTabBar::TriangularNorth: extraClass |= PseudoClass_Top; break; case QTabBar::RoundedSouth: case QTabBar::TriangularSouth: extraClass |= PseudoClass_Bottom; break; case QTabBar::RoundedEast: case QTabBar::TriangularEast: extraClass |= PseudoClass_Left; break; case QTabBar::RoundedWest: case QTabBar::TriangularWest: extraClass |= PseudoClass_Right; break; default: break; }#endif#ifndef QT_NO_TABBAR } else if (const QStyleOptionTab *tab = qstyleoption_cast<const QStyleOptionTab *>(opt)) { if (tab->position == QStyleOptionTab::OnlyOneTab) extraClass |= PseudoClass_OnlyOne; else if (tab->position == QStyleOptionTab::Beginning) extraClass |= PseudoClass_First; else if (tab->position == QStyleOptionTab::End) extraClass |= PseudoClass_Last; else if (tab->position == QStyleOptionTab::Middle) extraClass |= PseudoClass_Middle; if (tab->selectedPosition == QStyleOptionTab::NextIsSelected) extraClass |= PseudoClass_NextSelected; else if (tab->selectedPosition == QStyleOptionTab::PreviousIsSelected) extraClass |= PseudoClass_PreviousSelected; switch (tab->shape) { case QTabBar::RoundedNorth: case QTabBar::TriangularNorth: extraClass |= PseudoClass_Top; break; case QTabBar::RoundedSouth: case QTabBar::TriangularSouth: extraClass |= PseudoClass_Bottom; break; case QTabBar::RoundedEast: case QTabBar::TriangularEast: extraClass |= PseudoClass_Left; break; case QTabBar::RoundedWest: case QTabBar::TriangularWest: extraClass |= PseudoClass_Right; break; default: break; }#endif // QT_NO_TABBAR } else if (const QStyleOptionButton *btn = qstyleoption_cast<const QStyleOptionButton *>(opt)) { if (btn->features & QStyleOptionButton::Flat) extraClass |= PseudoClass_Flat; if (btn->features & QStyleOptionButton::DefaultButton) extraClass |= PseudoClass_Default; } else if (const QStyleOptionFrame *frm = qstyleoption_cast<const QStyleOptionFrame *>(opt)) { if (frm->lineWidth == 0) extraClass |= PseudoClass_Frameless; if (const QStyleOptionFrameV2 *frame2 = qstyleoption_cast<const QStyleOptionFrameV2 *>(opt)) { if (frame2->features & QStyleOptionFrameV2::Flat) extraClass |= PseudoClass_Flat; } }#ifndef QT_NO_TOOLBAR else if (const QStyleOptionToolBar *tb = qstyleoption_cast<const QStyleOptionToolBar *>(opt)) { if (tb->toolBarArea == Qt::LeftToolBarArea) extraClass |= PseudoClass_Left; else if (tb->toolBarArea == Qt::RightToolBarArea) extraClass |= PseudoClass_Right; else if (tb->toolBarArea == Qt::TopToolBarArea) extraClass |= PseudoClass_Top; else if (tb->toolBarArea == Qt::BottomToolBarArea) extraClass |= PseudoClass_Bottom; if (tb->positionWithinLine == QStyleOptionToolBar::Beginning) extraClass |= PseudoClass_First; else if (tb->positionWithinLine == QStyleOptionToolBar::Middle) extraClass |= PseudoClass_Middle; else if (tb->positionWithinLine == QStyleOptionToolBar::End) extraClass |= PseudoClass_Last; else if (tb->positionWithinLine == QStyleOptionToolBar::OnlyOne) extraClass |= PseudoClass_OnlyOne; }#endif // QT_NO_TOOLBAR#ifndef QT_NO_TOOLBOX else if (const QStyleOptionToolBoxV2 *tab = qstyleoption_cast<const QStyleOptionToolBoxV2 *>(opt)) { if (tab->position == QStyleOptionToolBoxV2::OnlyOneTab) extraClass |= PseudoClass_OnlyOne; else if (tab->position == QStyleOptionToolBoxV2::Beginning) extraClass |= PseudoClass_First; else if (tab->position == QStyleOptionToolBoxV2::End) extraClass |= PseudoClass_Last; else if (tab->position == QStyleOptionToolBoxV2::Middle) extraClass |= PseudoClass_Middle; if (tab->selectedPosition == QStyleOptionToolBoxV2::NextIsSelected) extraClass |= PseudoClass_NextSelected; else if (tab->selectedPosition == QStyleOptionToolBox
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -