⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qwindowsvistastyle.cpp

📁 奇趣公司比较新的qt/emd版本
💻 CPP
📖 第 1 页 / 共 5 页
字号:
            }            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 + -