📄 qplastiquestyle.cpp
字号:
#endif{ if (!qgetenv("QT_STYLE_NO_PIXMAPCACHE").isNull()) UsePixmapCache = false;}/*! \internal */QPlastiqueStylePrivate::~QPlastiqueStylePrivate(){}/*! \class QPlastiqueStyle \brief The QPlastiqueStyle class provides a widget style similar to the Plastik style available in KDE. The Plastique style provides a default look and feel for widgets on X11 that closely resembles the Plastik style, introduced by Sandro Giessl in KDE 3.2. \img qplastiquestyle.png \sa QWindowsXPStyle, QMacStyle, QWindowsStyle, QCDEStyle, QMotifStyle*//*! Constructs a QPlastiqueStyle object.*/QPlastiqueStyle::QPlastiqueStyle() : QWindowsStyle(*new QPlastiqueStylePrivate){ setObjectName(QLatin1String("Plastique"));}/*! Destructs the QPlastiqueStyle object.*/QPlastiqueStyle::~QPlastiqueStyle(){}/*! \reimp*/void QPlastiqueStyle::drawPrimitive(PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const{ Q_ASSERT(option); QColor borderColor = option->palette.background().color().darker(178); QColor gradientStartColor = option->palette.button().color().lighter(104); QColor gradientStopColor = option->palette.button().color().darker(105); QColor baseGradientStartColor = option->palette.base().color().darker(101); QColor baseGradientStopColor = option->palette.base().color().darker(106); QColor highlightedGradientStartColor = option->palette.button().color().lighter(101); QColor highlightedGradientStopColor = mergedColors(option->palette.button().color(), option->palette.highlight().color(), 85); QColor highlightedBaseGradientStartColor = option->palette.base().color(); QColor highlightedBaseGradientStopColor = mergedColors(option->palette.base().color().darker(105), option->palette.highlight().color(), 70); QColor highlightedDarkInnerBorderColor = mergedColors(option->palette.button().color(), option->palette.highlight().color(), 35); QColor highlightedLightInnerBorderColor = mergedColors(option->palette.button().color(), option->palette.highlight().color(), 58); QColor alphaCornerColor; if (widget) { // ### backgroundrole/foregroundrole should be part of the style option alphaCornerColor = mergedColors(option->palette.color(widget->backgroundRole()), borderColor); } else { alphaCornerColor = mergedColors(option->palette.background().color(), borderColor); } QColor alphaInnerColor = mergedColors(highlightedLightInnerBorderColor, gradientStartColor); QColor alphaInnerColorNoHover = mergedColors(borderColor, gradientStartColor); QColor alphaTextColor = mergedColors(option->palette.background().color(), option->palette.text().color()); QColor alphaLightTextColor = mergedColors(option->palette.background().color().lighter(250), option->palette.text().color().lighter(250)); QColor lightShadow = option->palette.button().color().lighter(105); QColor shadowGradientStartColor = option->palette.button().color().darker(115); QColor shadow = shadowGradientStartColor; switch (element) { case PE_IndicatorButtonDropDown: drawPrimitive(PE_PanelButtonTool, option, painter, widget); break; case PE_FrameDefaultButton: { if (!(option->state & QStyle::State_Enabled)) break; painter->setPen(QPen(QColor(0, 0, 0, 127), 0)); const QLine lines[4] = { QLine(option->rect.left() + 2, option->rect.top(), option->rect.right() - 2, option->rect.top()), QLine(option->rect.left() + 2, option->rect.bottom(), option->rect.right() - 2, option->rect.bottom()), QLine(option->rect.left(), option->rect.top() + 2, option->rect.left(), option->rect.bottom() - 2), QLine(option->rect.right(), option->rect.top() + 2, option->rect.right(), option->rect.bottom() - 2) }; painter->drawLines(lines, 4); QPoint points[8]; points[0] = QPoint(option->rect.left() + 1, option->rect.top() + 1); points[1] = QPoint(option->rect.right() - 1, option->rect.top() + 1); points[2] = QPoint(option->rect.left() + 1, option->rect.bottom() - 1); points[3] = QPoint(option->rect.right() - 1, option->rect.bottom() - 1); painter->drawPoints(points, 4); painter->setPen(QPen(QColor(0, 0, 0, 63), 0)); points[0] = QPoint(option->rect.left() + 1, option->rect.top()); points[1] = QPoint(option->rect.right() - 1, option->rect.top()); points[2] = QPoint(option->rect.left(), option->rect.top() + 1); points[3] = QPoint(option->rect.right(), option->rect.top() + 1); points[4] = QPoint(option->rect.left() + 1, option->rect.bottom()); points[5] = QPoint(option->rect.right() - 1, option->rect.bottom()); points[6] = QPoint(option->rect.left(), option->rect.bottom() - 1); points[7] = QPoint(option->rect.right(), option->rect.bottom() - 1); painter->drawPoints(points, 8); break; }#ifndef QT_NO_TABWIDGET case PE_FrameTabWidget: if (const QStyleOptionTabWidgetFrame *twf = qstyleoption_cast<const QStyleOptionTabWidgetFrame *>(option)) { if (twf->shape != QTabBar::RoundedNorth && twf->shape != QTabBar::RoundedWest && twf->shape != QTabBar::RoundedSouth && twf->shape != QTabBar::RoundedEast) { QWindowsStyle::drawPrimitive(element, option, painter, widget); break; } int borderThickness = pixelMetric(PM_TabBarBaseOverlap, twf, widget); bool reverse = (twf->direction == Qt::RightToLeft); painter->save(); // Start by filling the contents of the tab widget frame (which is // actually a panel). painter->fillRect(option->rect.adjusted(1, 1, -1, -1), option->palette.window()); QRect tabBarRect; switch (twf->shape) { case QTabBar::RoundedNorth: if (reverse) tabBarRect = QRect(twf->rect.right() - twf->leftCornerWidgetSize.width() - twf->tabBarSize.width() + 1, twf->rect.top(), twf->tabBarSize.width(), borderThickness); else tabBarRect = QRect(twf->rect.left() + twf->leftCornerWidgetSize.width(), twf->rect.top(), twf->tabBarSize.width(), borderThickness); break ; case QTabBar::RoundedWest: tabBarRect = QRect(twf->rect.left(), twf->rect.top() + twf->leftCornerWidgetSize.height(), borderThickness, twf->tabBarSize.height()); break ; case QTabBar::RoundedEast: tabBarRect = QRect(twf->rect.right() - borderThickness + 1, twf->rect.top() + twf->leftCornerWidgetSize.height(), borderThickness, twf->tabBarSize.height()); break ; case QTabBar::RoundedSouth: if (reverse) tabBarRect = QRect(twf->rect.right() - twf->leftCornerWidgetSize.width() - twf->tabBarSize.width() + 1, twf->rect.bottom() - borderThickness + 1, twf->tabBarSize.width(), borderThickness); else tabBarRect = QRect(twf->rect.left() + twf->leftCornerWidgetSize.width(), twf->rect.bottom() - borderThickness + 1, twf->tabBarSize.width(), borderThickness); break ; default: break; } QRegion region(twf->rect); region -= tabBarRect; painter->setClipRegion(region); // Outer border QLine leftLine = QLine(twf->rect.topLeft() + QPoint(0, 2), twf->rect.bottomLeft() - QPoint(0, 2)); QLine rightLine = QLine(twf->rect.topRight() + QPoint(0, 2), twf->rect.bottomRight() - QPoint(0, 2)); QLine bottomLine = QLine(twf->rect.bottomLeft() + QPoint(2, 0), twf->rect.bottomRight() - QPoint(2, 0)); QLine topLine = QLine(twf->rect.topLeft() + QPoint(2, 0), twf->rect.topRight() - QPoint(2, 0)); QBrush border = option->palette.shadow(); qBrushSetAlphaF(&border, 0.4); painter->setPen(QPen(border, 0)); QVarLengthArray<QLine, 4> lines; QVarLengthArray<QPoint, 8> points; lines.append(topLine); // Inner border QLine innerLeftLine = QLine(leftLine.p1() + QPoint(1, 0), leftLine.p2() + QPoint(1, 0)); QLine innerRightLine = QLine(rightLine.p1() - QPoint(1, 0), rightLine.p2() - QPoint(1, 0)); QLine innerBottomLine = QLine(bottomLine.p1() - QPoint(0, 1), bottomLine.p2() - QPoint(0, 1)); QLine innerTopLine = QLine(topLine.p1() + QPoint(0, 1), topLine.p2() + QPoint(0, 1)); // Rounded Corner QPoint leftBottomOuterCorner = QPoint(innerLeftLine.p2() + QPoint(0, 1)); QPoint leftBottomInnerCorner1 = QPoint(leftLine.p2() + QPoint(0, 1)); QPoint leftBottomInnerCorner2 = QPoint(bottomLine.p1() - QPoint(1, 0)); QPoint rightBottomOuterCorner = QPoint(innerRightLine.p2() + QPoint(0, 1)); QPoint rightBottomInnerCorner1 = QPoint(rightLine.p2() + QPoint(0, 1)); QPoint rightBottomInnerCorner2 = QPoint(bottomLine.p2() + QPoint(1, 0)); QPoint rightTopOuterCorner = QPoint(innerRightLine.p1() - QPoint(0, 1)); QPoint rightTopInnerCorner1 = QPoint(rightLine.p1() - QPoint(0, 1)); QPoint rightTopInnerCorner2 = QPoint(topLine.p2() + QPoint(1, 0)); QPoint leftTopOuterCorner = QPoint(innerLeftLine.p1() - QPoint(0, 1)); QPoint leftTopInnerCorner1 = QPoint(leftLine.p1() - QPoint(0, 1)); QPoint leftTopInnerCorner2 = QPoint(topLine.p1() - QPoint(1, 0)); lines.append(leftLine); lines.append(rightLine); lines.append(bottomLine); painter->drawLines(lines.constData(), lines.size()); lines.clear(); points.append(leftBottomOuterCorner); points.append(rightBottomOuterCorner); points.append(rightTopOuterCorner); points.append(leftTopOuterCorner); painter->drawPoints(points.constData(), points.size()); points.clear(); QBrush innerTopLeft = option->palette.shadow(); qBrushSetAlphaF(&innerTopLeft, 0.075); painter->setPen(QPen(innerTopLeft, 0)); lines.append(innerLeftLine); lines.append(innerTopLine); painter->drawLines(lines.constData(), lines.size()); lines.clear(); QBrush innerBottomRight = option->palette.shadow(); qBrushSetAlphaF(&innerBottomRight, 0.23); painter->setPen(QPen(innerBottomRight, 0)); lines.append(innerRightLine); lines.append(innerBottomLine); painter->drawLines(lines.constData(), lines.size()); lines.clear(); QBrush corner = option->palette.shadow(); qBrushSetAlphaF(&corner, 0.25); painter->setPen(QPen(corner, 0)); points.append(leftBottomInnerCorner1); points.append(leftBottomInnerCorner2); points.append(rightBottomInnerCorner1); points.append(rightBottomInnerCorner2); points.append(rightTopInnerCorner1); points.append(rightTopInnerCorner2); points.append(leftTopInnerCorner1); points.append(leftTopInnerCorner2); painter->drawPoints(points.constData(), points.size()); points.clear(); painter->restore(); } break ;#endif // QT_NO_TABWIDGET#ifndef QT_NO_TABBAR case PE_FrameTabBarBase: if (const QStyleOptionTabBarBase *tbb = qstyleoption_cast<const QStyleOptionTabBarBase *>(option)) { if (tbb->shape != QTabBar::RoundedNorth && tbb->shape != QTabBar::RoundedWest && tbb->shape != QTabBar::RoundedSouth && tbb->shape != QTabBar::RoundedEast) { QWindowsStyle::drawPrimitive(element, option, painter, widget); break; } painter->save(); QRegion region(tbb->rect); region -= tbb->tabBarRect; painter->setClipRegion(region); QLine topLine = QLine(tbb->rect.bottomLeft() - QPoint(0, 1), tbb->rect.bottomRight() - QPoint(0, 1)); QLine bottomLine = QLine(tbb->rect.bottomLeft(), tbb->rect.bottomRight()); QBrush border = option->palette.shadow(); qBrushSetAlphaF(&border, 0.4); QBrush innerTopLeft = option->palette.shadow(); qBrushSetAlphaF(&innerTopLeft, 0.075); QBrush innerBottomRight = option->palette.shadow(); qBrushSetAlphaF(&innerBottomRight, 0.23); QBrush corner = option->palette.shadow(); qBrushSetAlphaF(&corner, 0.25); if (tbb->shape == QTabBar::RoundedSouth) painter->setPen(QPen(corner, 0)); else painter->setPen(QPen(border, 0)); painter->drawLine(topLine); if (tbb->shape != QTabBar::RoundedSouth) painter->setPen(QPen(innerTopLeft, 0)); else painter->setPen(QPen(border, 0)); painter->drawLine(bottomLine); painter->restore(); } break ;#endif // QT_NO_TABBAR#ifndef QT_NO_GROUPBOX case PE_FrameGroupBox: if (const QStyleOptionFrame *frame = qstyleoption_cast<const QStyleOptionFrame *>(option)) { QStyleOptionFrameV2 frameV2(*frame); if (frameV2.features & QStyleOptionFrameV2::Flat) { QPen oldPen = painter->pen(); painter->setPen(borderColor); painter->drawLine(frameV2.rect.topLeft(), frameV2.rect.topRight()); painter->setPen(oldPen); } else { frameV2.state &= ~(State_Sunken | State_HasFocus); drawPrimitive(PE_Frame, &frameV2, painter, widget); } } break;#endif // QT_NO_GROUPBOX case PE_Frame: { QFrame::Shadow shadow = QFrame::Plain; if (option->state & State_Sunken) shadow = QFrame::Sunken; else if (option->state & State_Raised) shadow = QFrame::Raised; qt_plastique_draw_frame(painter, option->rect, option, shadow); break; }#ifndef QT_NO_LINEEDIT case PE_FrameLineEdit: qt_plastique_draw_frame(painter, option->rect, option, QFrame::Sunken); break; case PE_PanelLineEdit: if (const QStyleOptionFrame *lineEdit = qstyleoption_cast<const QStyleOptionFrame *>(option)) { // Panel of a line edit inside combo box or spin box is drawn in CC_ComboBox and CC_SpinBox if (widget) {#ifndef QT_NO_COMBOBOX if (qobject_cast<const QComboBox *>(widget->parentWidget())) break;#endif#ifndef QT_NO_SPINBOX if (qobject_cast<const QAbstractSpinBox *>(widget->parentWidget())) break;#endif }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -