📄 qwindowsvistastyle.cpp
字号:
} if (btn->features & QStyleOptionButton::HasMenu) { int mbiw = 0, mbih = 0; XPThemeData theme(widget, 0, QLatin1String("TOOLBAR"), TP_DROPDOWNBUTTON); if (theme.isValid()) { SIZE size; if (pGetThemePartSize(theme.handle(), 0, theme.partId, theme.stateId, 0, TS_TRUE, &size) == S_OK) { mbiw = size.cx; mbih = size.cy; } } QRect ir = subElementRect(SE_PushButtonContents, option, 0); QStyleOptionButton newBtn = *btn; newBtn.rect = QStyle::visualRect(option->direction, option->rect, QRect(ir.right() - mbiw - 2, (option->rect.height()/2) - (mbih/2), mbiw + 1, mbih + 1)); drawPrimitive(PE_IndicatorArrowDown, &newBtn, painter, widget); } return; } break; case CE_ProgressBarContents: if (const QStyleOptionProgressBar *bar = qstyleoption_cast<const QStyleOptionProgressBar *>(option)) { int stateId = MBI_NORMAL; if (disabled) stateId = MBI_DISABLED; bool isIndeterminate = (bar->minimum == 0 && bar->maximum == 0); bool vertical = false; bool inverted = false; if (const QStyleOptionProgressBarV2 *pb2 = qstyleoption_cast<const QStyleOptionProgressBarV2 *>(option)) { vertical = (pb2->orientation == Qt::Vertical); inverted = pb2->invertedAppearance; } if (const QProgressBar *progressbar = qobject_cast<const QProgressBar *>(widget)) { if ((progressbar->value() > 0 || isIndeterminate) && d->transitionsEnabled()) { if (!d->widgetAnimation(progressbar)) { Animation *a = new Animation; a->setWidget(const_cast<QWidget*>(widget)); a->setStartTime(QTime::currentTime()); d->startAnimation(a); } } else { d->stopAnimation(progressbar); } } XPThemeData theme(widget, painter, QLatin1String("PROGRESS"), vertical ? PP_FILLVERT : PP_FILL); theme.rect = option->rect; bool reverse = bar->direction == Qt::LeftToRight && inverted || bar->direction == Qt::RightToLeft && !inverted; QTime current = QTime::currentTime(); if (isIndeterminate) { if (Animation *a = d->widgetAnimation(widget)) { int glowSize = 120; int animationWidth = glowSize * 2 + (vertical ? theme.rect.height() : theme.rect.width()); int animOffset = a->startTime().msecsTo(current) / 4; if (animOffset > animationWidth) a->setStartTime(QTime::currentTime()); painter->save(); painter->setClipRect(theme.rect); QRect animRect; QSize pixmapSize(14, 14); if (vertical) { animRect = QRect(theme.rect.left(), inverted ? rect.top() - glowSize + animOffset : rect.bottom() + glowSize - animOffset, rect.width(), glowSize); pixmapSize.setHeight(animRect.height()); } else { animRect = QRect(reverse ? rect.right() + glowSize - animOffset: rect.left() - glowSize + animOffset, rect.top(), glowSize, rect.height()); pixmapSize.setWidth(animRect.width()); } QString name = QString::fromLatin1("qiprogress-%1-%2").arg(pixmapSize.width()).arg(pixmapSize.height()); QPixmap pixmap; if (!QPixmapCache::find(name, pixmap)) { QImage image(pixmapSize, QImage::Format_ARGB32); image.fill(Qt::transparent); QPainter imagePainter(&image); theme.painter = &imagePainter; theme.partId = vertical ? PP_FILLVERT : PP_FILL; theme.rect = QRect(QPoint(0,0), theme.rect.size()); QLinearGradient alphaGradient(0, 0, vertical ? 0 : image.width(), vertical ? image.height() : 0); alphaGradient.setColorAt(0, QColor(0, 0, 0, 0)); alphaGradient.setColorAt(0.5, QColor(0, 0, 0, 220)); alphaGradient.setColorAt(1, QColor(0, 0, 0, 0)); imagePainter.fillRect(image.rect(), alphaGradient); imagePainter.setCompositionMode(QPainter::CompositionMode_SourceIn); d->drawBackground(theme); imagePainter.end(); pixmap = QPixmap::fromImage(image); QPixmapCache::insert(name, pixmap); } painter->drawPixmap(animRect, pixmap); painter->restore(); } } else { qint64 progress = qMax<qint64>(bar->progress, bar->minimum); // workaround for bug in QProgressBar if (vertical) { int maxHeight = option->rect.height(); int minHeight = 0; double vc6_workaround = ((progress - qint64(bar->minimum)) / double(qint64(bar->maximum) - qint64(bar->minimum))) * maxHeight; int height = isIndeterminate ? maxHeight: qMax(int(vc6_workaround), minHeight); theme.rect.setHeight(height); if (!inverted) theme.rect.moveTop(rect.height() - theme.rect.height()); } else { int maxWidth = option->rect.width(); int minWidth = 0; double vc6_workaround = ((progress - qint64(bar->minimum)) / double(qint64(bar->maximum) - qint64(bar->minimum))) * maxWidth; int width = isIndeterminate ? maxWidth : qMax(int(vc6_workaround), minWidth); theme.rect.setWidth(width); if (reverse) { theme.rect = QStyle::visualRect(bar->direction, option->rect, theme.rect); theme.rect.moveLeft(rect.width() - theme.rect.width()); } } d->drawBackground(theme); if (Animation *a = d->widgetAnimation(widget)) { int glowSize = 140; int animationWidth = glowSize * 2 + (vertical ? theme.rect.height() : theme.rect.width()); int animOffset = a->startTime().msecsTo(current) / 4; theme.partId = vertical ? PP_MOVEOVERLAYVERT : PP_MOVEOVERLAY; if (animOffset > animationWidth) a->setStartTime(QTime::currentTime()); painter->save(); painter->setClipRect(theme.rect); if (vertical) { theme.rect = QRect(theme.rect.left(), inverted ? rect.top() - glowSize + animOffset : rect.bottom() + glowSize - animOffset, rect.width(), glowSize); } else { theme.rect = QRect(reverse ? rect.right() + glowSize - animOffset: rect.left() - glowSize + animOffset, rect.top(), glowSize, rect.height()); } d->drawBackground(theme); painter->restore(); } } } break; case CE_MenuBarItem: { if (const QStyleOptionMenuItem *mbi = qstyleoption_cast<const QStyleOptionMenuItem *>(option)) { if (mbi->menuItemType == QStyleOptionMenuItem::DefaultItem) break; QPalette::ColorRole textRole = disabled ? QPalette::Text : QPalette::ButtonText; QPixmap pix = mbi->icon.pixmap(pixelMetric(PM_SmallIconSize), QIcon::Normal); uint alignment = Qt::AlignCenter | Qt::TextShowMnemonic | Qt::TextDontClip | Qt::TextSingleLine; if (!styleHint(SH_UnderlineShortcut, mbi, widget)) alignment |= Qt::TextHideMnemonic; //The rect adjustment is a workaround for the menu not really filling it's background. XPThemeData theme(widget, painter, QLatin1String("MENU"), MENU_BARBACKGROUND, 0, option->rect.adjusted(-1, 1 , 2, 1)); d->drawBackground(theme); int stateId = MBI_NORMAL; if (disabled) stateId = MBI_DISABLED; else if (pressed) stateId = MBI_PUSHED; else if (selected) stateId = MBI_HOT; XPThemeData theme2(widget, painter, QLatin1String("MENU"), MENU_BARITEM, stateId, option->rect); d->drawBackground(theme2); if (!pix.isNull()) drawItemPixmap(painter, mbi->rect, alignment, pix); else drawItemText(painter, mbi->rect, alignment, mbi->palette, mbi->state & State_Enabled, mbi->text, textRole); } } break;#ifndef QT_NO_MENU case CE_MenuItem: if (const QStyleOptionMenuItem *menuitem = qstyleoption_cast<const QStyleOptionMenuItem *>(option)) { // windows always has a check column, regardless whether we have an icon or not int checkcol = qMax(menuitem->maxIconWidth, 28); QColor darkLine = option->palette.background().color().darker(108); QColor lightLine = option->palette.background().color().lighter(107); QRect rect = option->rect; QStyleOptionMenuItem mbiCopy = *menuitem; //draw vertical menu line QPoint p1 = QStyle::visualPos(option->direction, menuitem->rect, QPoint(checkcol, rect.top())); QPoint p2 = QStyle::visualPos(option->direction, menuitem->rect, QPoint(checkcol, rect.bottom())); QRect gutterRect(p1.x(), p1.y(), 3, p2.y() - p1.y() + 1); XPThemeData theme2(widget, painter, QLatin1String("MENU"), MENU_POPUPGUTTER, stateId, gutterRect); d->drawBackground(theme2); int x, y, w, h; menuitem->rect.getRect(&x, &y, &w, &h); int tab = menuitem->tabWidth; bool dis = !(menuitem->state & State_Enabled); bool checked = menuitem->checkType != QStyleOptionMenuItem::NotCheckable ? menuitem->checked : false; bool act = menuitem->state & State_Selected; if (menuitem->menuItemType == QStyleOptionMenuItem::Separator) { int yoff = y-2 + h / 2; QPoint p1 = QPoint(x + checkcol, yoff); QPoint p2 = QPoint(x + w + 6 , yoff); int stateId = stateId = MBI_HOT; QRect subRect(p1.x(), p1.y(), p2.x() - p1.x(), 6); subRect = QStyle::visualRect(option->direction, option->rect, subRect ); XPThemeData theme2(widget, painter, QLatin1String("MENU"), MENU_POPUPSEPARATOR, stateId, subRect); d->drawBackground(theme2); return; } QRect vCheckRect = visualRect(option->direction, menuitem->rect, QRect(menuitem->rect.x(), menuitem->rect.y(), checkcol - 6, menuitem->rect.height())); if (act) { int stateId = stateId = MBI_HOT; XPThemeData theme2(widget, painter, QLatin1String("MENU"), MENU_POPUPITEM, stateId, option->rect); d->drawBackground(theme2); } if (checked) { XPThemeData theme(widget, painter, QLatin1String("MENU"), MENU_POPUPCHECKBACKGROUND, menuitem->icon.isNull() ? MBI_HOT : MBI_PUSHED, vCheckRect); d->drawBackground(theme); theme.partId = MENU_POPUPCHECK; bool bullet = menuitem->checkType & QStyleOptionMenuItem::Exclusive; if (dis) theme.stateId = bullet ? MC_BULLETDISABLED: MC_CHECKMARKDISABLED; else theme.stateId = bullet ? MC_BULLETNORMAL: MC_CHECKMARKNORMAL; d->drawBackground(theme); } if (!menuitem->icon.isNull()) { QIcon::Mode mode = dis ? QIcon::Disabled : QIcon::Normal; if (act && !dis) mode = QIcon::Active; QPixmap pixmap; if (checked) pixmap = menuitem->icon.pixmap(pixelMetric(PM_SmallIconSize), mode, QIcon::On); else pixmap = menuitem->icon.pixmap(pixelMetric(PM_SmallIconSize), mode); int pixw = pixmap.width(); int pixh = pixmap.height(); QRect pmr(0, 0, pixw, pixh); pmr.moveCenter(vCheckRect.center()); painter->setPen(menuitem->palette.text().color()); painter->drawPixmap(pmr.topLeft(), pixmap); } painter->setPen(menuitem->palette.buttonText().color()); QColor discol; if (dis) { discol = menuitem->palette.text().color(); painter->setPen(discol); } int xm = windowsItemFrame + checkcol + windowsItemHMargin; int xpos = menuitem->rect.x() + xm; QRect textRect(xpos, y + windowsItemVMargin, w - xm - windowsRightBorder - tab + 1, h - 2 * windowsItemVMargin); QRect vTextRect = visualRect(option->direction, menuitem->rect, textRect); QString s = menuitem->text; if (!s.isEmpty()) { // draw text painter->save(); int t = s.indexOf(QLatin1Char('\t')); int text_flags = Qt::AlignVCenter | Qt::TextShowMnemonic | Qt::TextDontClip | Qt::TextSingleLine; if (!styleHint(SH_UnderlineShortcut, menuitem, widget)) text_flags |= Qt::TextHideMnemonic; text_flags |= Qt::AlignLeft; if (t >= 0) { QRect vShortcutRect = visualRect(option->direction, menuitem->rect,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -