📄 qwindowsvistastyle.cpp
字号:
QRect(textRect.topRight(), QPoint(menuitem->rect.right(), textRect.bottom()))); painter->drawText(vShortcutRect, text_flags, s.mid(t + 1)); s = s.left(t); } QFont font = menuitem->font; if (menuitem->menuItemType == QStyleOptionMenuItem::DefaultItem) font.setBold(true); painter->setFont(font); painter->setPen(discol); painter->drawText(vTextRect, text_flags, s.left(t)); painter->restore(); } if (menuitem->menuItemType == QStyleOptionMenuItem::SubMenu) {// draw sub menu arrow int dim = (h - 2 * windowsItemFrame) / 2; PrimitiveElement arrow; arrow = (option->direction == Qt::RightToLeft) ? PE_IndicatorArrowLeft : PE_IndicatorArrowRight; xpos = x + w - windowsArrowHMargin - windowsItemFrame - dim; QRect vSubMenuRect = visualRect(option->direction, menuitem->rect, QRect(xpos, y + h / 2 - dim / 2, dim, dim)); QStyleOptionMenuItem newMI = *menuitem; newMI.rect = vSubMenuRect; newMI.state = dis ? State_None : State_Enabled; drawPrimitive(arrow, &newMI, painter, widget); } } break;#endif // QT_NO_MENU case CE_HeaderSection: if (const QStyleOptionHeader *header = qstyleoption_cast<const QStyleOptionHeader *>(option)) { name = QLatin1String("HEADER"); partId = HP_HEADERITEM; if (flags & State_Sunken) stateId = HIS_PRESSED; else if (flags & State_MouseOver) stateId = HIS_HOT; else stateId = HIS_NORMAL; if (header->sortIndicator != QStyleOptionHeader::None) stateId += 3; XPThemeData theme(widget, painter, name, partId, stateId, option->rect); d->drawBackground(theme); } break; case CE_MenuBarEmptyArea: { int stateId = MBI_NORMAL; if (!(state & State_Enabled)) stateId = MBI_DISABLED; XPThemeData theme(widget, painter, QLatin1String("MENU"), MENU_BARBACKGROUND, stateId, option->rect); d->drawBackground(theme); } break; case CE_ToolBar: if (const QStyleOptionToolBar *toolbar = qstyleoption_cast<const QStyleOptionToolBar *>(option)) { QPalette pal = option->palette; pal.setColor(QPalette::Dark, option->palette.background().color().darker(130)); QStyleOptionToolBar copyOpt = *toolbar; copyOpt.palette = pal; QWindowsStyle::drawControl(element, ©Opt, painter, widget); } break; case CE_DockWidgetTitle: if (const QDockWidget *dockWidget = qobject_cast<const QDockWidget *>(widget)) { QRect rect = option->rect; if (dockWidget->isFloating()) { QWindowsXPStyle::drawControl(element, option, painter, widget); break; //otherwise fall through } if (const QStyleOptionDockWidget *dwOpt = qstyleoption_cast<const QStyleOptionDockWidget *>(option)) { const QStyleOptionDockWidgetV2 *v2 = qstyleoption_cast<const QStyleOptionDockWidgetV2*>(dwOpt); bool verticalTitleBar = v2 == 0 ? false : v2->verticalTitleBar; if (verticalTitleBar) { QSize s = rect.size(); s.transpose(); rect.setSize(s); painter->translate(rect.left() - 1, rect.top() + rect.width()); painter->rotate(-90); painter->translate(-rect.left() + 1, -rect.top()); } painter->setBrush(option->palette.background().color().darker(110)); painter->setPen(option->palette.background().color().darker(130)); painter->drawRect(rect.adjusted(0, 1, -1, -3)); int buttonMargin = 4; int mw = pixelMetric(QStyle::PM_DockWidgetTitleMargin, dwOpt, widget); int fw = pixelMetric(PM_DockWidgetFrameWidth, dwOpt, widget); const QDockWidget *dw = qobject_cast<const QDockWidget *>(widget); bool isFloating = dw != 0 && dw->isFloating(); QRect r = option->rect.adjusted(0, 2, -1, -3); QRect titleRect = r; if (dwOpt->closable) { QPixmap pm = standardIcon(QStyle::SP_TitleBarCloseButton, dwOpt, widget).pixmap(10, 10); titleRect.adjust(0, 0, -pm.size().width() - mw - buttonMargin, 0); } if (dwOpt->floatable) { QPixmap pm = standardIcon(QStyle::SP_TitleBarMaxButton, dwOpt, widget).pixmap(10, 10); titleRect.adjust(0, 0, -pm.size().width() - mw - buttonMargin, 0); } if (isFloating) { titleRect.adjust(0, -fw, 0, 0); if (widget != 0 && widget->windowIcon().cacheKey() != qApp->windowIcon().cacheKey()) titleRect.adjust(titleRect.height() + mw, 0, 0, 0); } else { titleRect.adjust(mw, 0, 0, 0); if (!dwOpt->floatable && !dwOpt->closable) titleRect.adjust(0, 0, -mw, 0); } if (!verticalTitleBar) titleRect = visualRect(dwOpt->direction, r, titleRect); if (!dwOpt->title.isEmpty()) { QString titleText = painter->fontMetrics().elidedText(dwOpt->title, Qt::ElideRight, verticalTitleBar ? titleRect.height() : titleRect.width()); const int indent = painter->fontMetrics().descent(); drawItemText(painter, rect.adjusted(indent + 1, 1, -indent - 1, -1), Qt::AlignLeft | Qt::AlignVCenter, dwOpt->palette, dwOpt->state & State_Enabled, titleText, QPalette::WindowText); } } break; } default: QWindowsXPStyle::drawControl(element, option, painter, widget); break; }}/*! \reimp see drawPrimitive for comments on the animation support */void QWindowsVistaStyle::drawComplexControl(ComplexControl control, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) const{ QWindowsVistaStylePrivate *d = const_cast<QWindowsVistaStylePrivate*>(d_func()); if (!QWindowsVistaStylePrivate::useVista()) { QWindowsStyle::drawComplexControl(control, option, painter, widget); return; } State state = option->state; SubControls sub = option->subControls; QRect r = option->rect; int partId = 0; int stateId = 0; State flags = option->state; if (widget && widget->testAttribute(Qt::WA_UnderMouse) && widget->isActiveWindow()) flags |= State_MouseOver; if (d->transitionsEnabled() && widget) { if ((qobject_cast<const QScrollBar *>(widget) && control == CC_ScrollBar)|| (qobject_cast<const QAbstractSpinBox*>(widget) && control == CC_SpinBox) || (qobject_cast<const QComboBox*>(widget) && control == CC_ComboBox)) { QWidget *w = const_cast<QWidget *> (widget); int oldState = w->property("_q_stylestate").toInt(); int oldActiveControls = w->property("_q_stylecontrols").toInt(); QRect oldRect = w->property("_q_stylerect").toRect(); w->setProperty("_q_stylestate", (int)option->state); w->setProperty("_q_stylecontrols", (int)option->activeSubControls); w->setProperty("_q_stylerect", w->rect()); bool doTransition = ((state & State_Sunken) != (oldState & State_Sunken) || (state & State_On) != (oldState & State_On) || (state & State_MouseOver) != (oldState & State_MouseOver) || oldActiveControls != option->activeSubControls); if (qstyleoption_cast<const QStyleOptionSlider *>(option)) { QRect oldSliderPos = w->property("_q_stylesliderpos").toRect(); QRect currentPos = subControlRect(CC_ScrollBar, option, SC_ScrollBarSlider, widget); w->setProperty("_q_stylesliderpos", currentPos); if (oldSliderPos != currentPos) { doTransition = false; d->stopAnimation(widget); } } else if (control == CC_SpinBox) { //spinboxes have a transition when focus changes if (!doTransition) doTransition = (state & State_HasFocus) != (oldState & State_HasFocus); } if (oldRect != option->rect) { doTransition = false; d->stopAnimation(widget); } if (doTransition) { QImage startImage(option->rect.size(), QImage::Format_ARGB32_Premultiplied); QImage endImage(option->rect.size(), QImage::Format_ARGB32_Premultiplied); Animation *anim = d->widgetAnimation(widget); Transition *t = new Transition; t->setWidget(w); if (!anim) { if (const QStyleOptionComboBox *combo = qstyleoption_cast<const QStyleOptionComboBox*>(option)) { //Combo boxes are special cased to avoid cleartype issues startImage.fill(0); QPainter startPainter(&startImage); QStyleOptionComboBox startCombo = *combo; startCombo.state = (QStyle::State)oldState; startCombo.activeSubControls = (QStyle::SubControl)oldActiveControls; drawComplexControl(control, &startCombo, &startPainter, 0 /* Intentional */); t->setStartImage(startImage); } else if (const QStyleOptionSlider *slider = qstyleoption_cast<const QStyleOptionSlider*>(option)) { //This is a workaround for the direct3d engine as it currently has some issues with grabWindow startImage.fill(0); QPainter startPainter(&startImage); QStyleOptionSlider startSlider = *slider; startSlider.state = (QStyle::State)oldState; startSlider.activeSubControls = (QStyle::SubControl)oldActiveControls; drawComplexControl(control, &startSlider, &startPainter, 0 /* Intentional */); t->setStartImage(startImage); } else { t->setStartImage(QPixmap::grabWindow(widget->winId(), 0, 0 , option->rect.width(), option->rect.height()).toImage()); } } else { startImage.fill(0); QPainter startPainter(&startImage); anim->paint(&startPainter, option); t->setStartImage(startImage); } d->startAnimation(t); endImage.fill(0); QPainter endPainter(&endImage); drawComplexControl(control, option, &endPainter, 0 /* Intentional */); t->setEndImage(endImage); t->setStartTime(QTime::currentTime()); if (option->state & State_MouseOver || option->state & State_Sunken) t->setDuration(150); else t->setDuration(500); } if (Animation *anim = d->widgetAnimation(widget)) { anim->paint(painter, option); return; } } } switch (control) { case CC_ComboBox: if (const QStyleOptionComboBox *cmb = qstyleoption_cast<const QStyleOptionComboBox *>(option)) { if (cmb->editable) { if (sub & SC_ComboBoxEditField) { partId = EP_EDITBORDER_NOSCROLL; if (!(flags & State_Enabled)) stateId = ETS_DISABLED; else if (flags & State_MouseOver) stateId = ETS_HOT; else if (flags & State_HasFocus) stateId = ETS_FOCUSED; else stateId = ETS_NORMAL; XPThemeData theme(widget, painter, QLatin1String("EDIT"), partId, stateId, r); d->drawBackground(theme); } if (sub & SC_ComboBoxArrow) { QRect subRect = subControlRect(CC_ComboBox, option, SC_ComboBoxArrow, widget); XPThemeData theme(widget, painter, QLatin1String("COMBOBOX")); theme.rect = subControlRect(CC_ComboBox, option, SC_ComboBoxArrow, widget); partId = option->direction == Qt::RightToLeft ? CP_DROPDOWNBU
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -