5#include <QtGui/qpainter.h>
6#include <QtGui/qpainterpath.h>
7#include <QtWidgets/qcheckbox.h>
8#include <QtWidgets/qcombobox.h>
9#include <QtWidgets/qgroupbox.h>
10#include <QtWidgets/qlineedit.h>
11#include <QtWidgets/qlistview.h>
12#include <QtWidgets/qmdisubwindow.h>
13#include <QtWidgets/qpushbutton.h>
14#include <QtWidgets/qradiobutton.h>
15#include <QtWidgets/qscrollbar.h>
16#include <QtWidgets/qspinbox.h>
17#include <QtWidgets/qstyleditemdelegate.h>
18#include <QtWidgets/qstyleoption.h>
19#include <QtWidgets/qtoolbutton.h>
20#include <QtWidgets/qtreeview.h>
21#include "qpa/qplatformtheme.h"
22#include "private/qguiapplication_p.h"
23#include "private/qstylehelper_p.h"
28constexpr int checkBoxOrRadioButtonIndicatorSize = 24;
29constexpr int checkBoxOrRadioButtonIndicatorStrokeWidth = 1;
30constexpr int checkBoxOrRadioButtonIndicatorGap = 2;
31constexpr int checkBoxOrRadioButtonHoverSize =
32 checkBoxOrRadioButtonIndicatorSize + (2 * checkBoxOrRadioButtonIndicatorGap);
33constexpr int checkBoxOrRadioButtonFocusStrokeWidth = 2;
34constexpr int checkBoxOrRadioButtonSize =
35 checkBoxOrRadioButtonIndicatorSize + (2 * checkBoxOrRadioButtonIndicatorGap)
36 + (2 * checkBoxOrRadioButtonFocusStrokeWidth);
37constexpr int radioButtonIndicatorStrokeWidth = 6;
39constexpr int textCursorWidth = 1;
41constexpr int itemViewItemHorizontalMargin = 16;
42constexpr int itemViewItemVerticalMargin = 8;
43constexpr int itemViewItemWithDecorationVerticalMargin = 10;
44constexpr int itemViewItemSpacing = 8;
45constexpr int itemViewSeparatorHeight = 5;
47constexpr int focusFrameWidth = 2;
48constexpr int focusFrameCornerRadius = 16;
50constexpr int headerMargin = 16;
51constexpr int headerDefaultSectionSizeVertical = 48;
53constexpr double lineEditCornerRadius = 32.0;
54constexpr int lineEditHorizontalMargin = 16;
55constexpr int lineEditVerticalMargin = 9;
57constexpr int menuBarItemSpacing = 16;
58constexpr int menuBarVerticalMargin = 8;
59constexpr int menuBarHorizontalMargin = 8;
61constexpr int menuItemVerticalMargin = 8;
62constexpr int menuItemCornerRadius = 4;
63constexpr int menuItemHoverHorizontalMargin = 4;
65constexpr int pushButtonHorizontalMargin = 16;
66constexpr int pushButtonVerticalMargin = 8;
67constexpr int pushButtonCornerRadius = 8;
68constexpr int pushButtonFocusFrameGap = 2;
69constexpr int pushButtonFocusFrameWidth = 2;
71constexpr int progressBarMinHeight = 24;
72constexpr int progressBarGrooveHeight = 4;
73constexpr int progressBarCornerRadius = 2;
75constexpr int shadowXSRadius = 22;
77constexpr int sliderThickness = 40;
78constexpr int sliderGrooveHeight = 4;
79constexpr int sliderCornerRadius = 2;
80constexpr int sliderThumbSize = 16;
81constexpr int sliderHoverSize = 4;
82constexpr int sliderFocusStrokeWidth = 2;
84constexpr int smallIconSize = 12;
86constexpr int splitterHandleWidth = 6;
87constexpr int splitterWidth = 12;
89constexpr int titleBarHeight = 46;
91constexpr int toolButtonCornerRadius = 4;
92constexpr int toolButtonFocusFrameWidth = 2;
94constexpr int toolTipCornerRadius = 8;
95constexpr int toolTipFrameWidth = 8;
96constexpr int toolTipBackgroundAlpha = 204;
98constexpr int spinBoxFrameHeight = 32;
99constexpr int spinBoxButtonBoxWidth = 32;
100constexpr int spinBoxButtonBoxHeight = 16;
101constexpr int spinBoxEditHorizontalMargin = 4;
102constexpr double spinBoxFrameRadius = 12.0;
103constexpr int spinBoxFrameStroke = 2;
105constexpr int maxScrollBarSize = 9;
106constexpr int thinScrollBarSize = 3;
107constexpr int thickScrollBarSize = 6;
109constexpr int tabBarTabRadius = 8;
110constexpr int tabBarTabFrameWidth = 2;
111constexpr int tabBarTabUnderLineWidth = 2;
113constexpr int groupBoxBottomPadding = 8;
114constexpr int groupBoxFrameCornerRadius = 8;
115constexpr int groupBoxHorizontalPadding = 12;
116constexpr int groupBoxTitleTextFontSize = 20;
117constexpr int groupBoxTitleToContentSpacing = 8;
118constexpr int groupBoxTopPadding = 24;
120constexpr int comboBoxVerticalMargin = 4;
121constexpr int comboBoxFrameRadius = 8;
122constexpr int comboBoxFrameLeftRightPadding = 16;
123constexpr int comboBoxFocusFrameWidth = 2;
125constexpr int tabWidgetFrameWidth = 1;
127constexpr double ohos_id_alpha_disabled = 0.4;
128constexpr double ohos_id_alpha_content_tertiary = 0.4;
130QColor makeInactiveOrDisabledFromColor(
const QColor &color)
132 auto disabledColor = color;
133 disabledColor.setAlphaF(ohos_id_alpha_disabled);
135 return disabledColor;
139bool qobjectIsInstanceOf(
const QObject *obj)
141 return qobject_cast<
const T *>(obj) !=
nullptr;
145bool qStyleOptionIs(
const QStyleOption *option)
147 return qstyleoption_cast<
const T *>(option) !=
nullptr;
150bool isItemViewSeparator(
const QModelIndex &index)
152 return index.data(Qt::AccessibleDescriptionRole).toString() == QLatin1String(
"separator");
155bool isFirstItem(
const QModelIndex &index)
157 return index.isValid() && index.row() == 0 && index.column() == 0;
160bool isLastItem(
const QModelIndex &index)
162 return index.isValid()
163 && index.row() == index.model()->rowCount(index.parent()) - 1
164 && index.column() == index.model()->columnCount(index.parent()) - 1;
167bool isHoverable(
const QWidget *widget)
169 static bool (*
const hoverTypeCheckFuncs[])(
const QObject *obj) = {
170 &qobjectIsInstanceOf<QCheckBox>,
171 &qobjectIsInstanceOf<QPushButton>,
172 &qobjectIsInstanceOf<QRadioButton>,
173 &qobjectIsInstanceOf<QSlider>,
174 &qobjectIsInstanceOf<QToolButton>,
175 &qobjectIsInstanceOf<QComboBox>,
176 &qobjectIsInstanceOf<QScrollBar>,
180 std::begin(hoverTypeCheckFuncs),
std::end(hoverTypeCheckFuncs),
181 [&](
const auto &typeCheckFunc) {
182 return typeCheckFunc(widget);
186QRect adjusted(
const QRect &rect,
int growth)
188 return rect.adjusted(-growth, -growth, growth, growth);
191QColor getSunkenOrHoverColor(
bool isSunken,
const QPalette &palette)
194 ? palette.color(QPalette::Active, QPalette::Dark)
195 : palette.color(QPalette::Active, QPalette::Light);
198void paintOnStackTop(QPainter &painter,
const std::function<
void(QPainter &painter)> &paint)
205void drawLine(QPainter &painter,
const QPen &pen,
const QPoint &aPoint,
const QPoint &bPoint)
207 paintOnStackTop(painter, [&](QPainter &painter) {
208 painter.setRenderHints(QPainter::Antialiasing);
210 painter.drawLine(aPoint, bPoint);
214void drawEllipse(QPainter &painter,
const QPen &pen,
const QBrush &brush,
const QRect &rect)
217 painter.setRenderHints(QPainter::Antialiasing);
219 painter.setBrush(brush);
220 painter.drawEllipse(rect);
224void drawRect(QPainter &painter,
const QPen &pen,
const QBrush &brush,
const QRect &rect)
226 paintOnStackTop(painter, [&](QPainter &painter) {
227 painter.setRenderHints(QPainter::Antialiasing);
229 painter.setBrush(brush);
230 painter.drawRect(rect);
235 QPainter &painter,
const QPen &pen,
const QBrush &brush,
const QRect &rect, qreal xRadius, qreal yRadius)
237 paintOnStackTop(painter, [&](QPainter &painter) {
238 painter.setRenderHints(QPainter::Antialiasing);
240 painter.setBrush(brush);
241 painter.drawRoundedRect(rect, xRadius, yRadius);
245QPainterPath roundedPathInRect(
246 const QRect &rect, qreal topLeftCornerRadius, qreal topRightCornerRadius, qreal bottomLeftCornerRadius,
247 qreal bottomRightCornerRadius)
251 const auto bottom = rect.y() + rect.height();
252 const auto right = rect.x() + rect.width();
254 const auto topLeftDiameter = 2 * topLeftCornerRadius;
255 path.moveTo(rect.x() + topLeftCornerRadius, rect.y());
256 path.arcTo(rect.x(), rect.y(), topLeftDiameter, topLeftDiameter, 90.0, 90.0);
258 const auto bottomLeftDiameter = 2 * bottomLeftCornerRadius;
259 path.lineTo(rect.x(), bottom - bottomLeftCornerRadius);
260 path.arcTo(rect.x(), bottom - bottomLeftDiameter, bottomLeftDiameter, bottomLeftDiameter, 180.0, 90.0);
262 const auto bottomRightDiameter = 2 * bottomRightCornerRadius;
263 path.lineTo(right - bottomRightCornerRadius, bottom);
265 right - bottomRightDiameter, bottom - bottomRightDiameter, bottomRightDiameter, bottomRightDiameter, 270.0,
268 const auto topRightDiameter = 2 * topRightCornerRadius;
269 path.lineTo(right, rect.y() + topRightCornerRadius);
270 path.arcTo(right - topRightDiameter, rect.y(), topRightDiameter, topRightDiameter, 360.0, 90.0);
277void drawPath(QPainter &painter,
const QPen &pen,
const QBrush &brush,
const QPainterPath& path)
279 paintOnStackTop(painter, [&](QPainter &painter) {
280 painter.setRenderHints(QPainter::Antialiasing);
282 painter.setBrush(brush);
283 painter.drawPath(path);
288 QPainter &painter,
const QPen &pen,
const QBrush brush,
const QRect &rect, qreal topLeftCornerRadius,
289 qreal topRightCornerRadius, qreal bottomLeftCornerRadius, qreal bottomRightCornerRadius)
292 painter, pen, brush, roundedPathInRect(rect, topLeftCornerRadius, topRightCornerRadius, bottomLeftCornerRadius,
293 bottomRightCornerRadius));
297 QPainter &painter,
const QPen &pen,
const QBrush &brush,
const std::vector<QPointF> &polygonPoints)
299 paintOnStackTop(painter, [&](
auto &p) {
300 p.setRenderHint(QPainter::Antialiasing);
303 p.drawPolyline(polygonPoints.data(), polygonPoints.size());
307void drawCheckBoxOrRadioButtonIndicator(QPainter &painter,
const QStyleOption &option,
bool isCheckBox)
309 const auto isEnabled = option.state.testFlag(QStyle::State_Enabled);
310 const auto isOn = option.state.testFlag(QStyle::State_On);
311 const auto isMouseOver = option.state.testFlag(QStyle::State_MouseOver);
312 const auto isSunken = option.state.testFlag(QStyle::State_Sunken);
315 painter.setRenderHints(QPainter::Antialiasing);
317 painter.setOpacity(isEnabled ? 1.0 : ohos_id_alpha_disabled);
319 QRect hoverRect(0, 0, checkBoxOrRadioButtonHoverSize, checkBoxOrRadioButtonHoverSize);
320 hoverRect.moveCenter(option.rect.center());
321 if (isMouseOver || isSunken)
322 drawEllipse(painter, Qt::NoPen, getSunkenOrHoverColor(isSunken, option.palette), hoverRect);
324 QRect indicatorRect(0, 0, checkBoxOrRadioButtonIndicatorSize, checkBoxOrRadioButtonIndicatorSize);
325 indicatorRect.moveCenter(option.rect.center());
327 auto activeColor = option.palette.color(QPalette::Active, QPalette::Button);
330 drawEllipse(painter, Qt::NoPen, activeColor, indicatorRect);
332 QPixmap svgPixmap(indicatorRect.size());
333 if (svgPixmap.load(QString::fromStdString(
":/resources/ic_gallery_material_select_checkbo.svg"))) {
334 painter.drawPixmap(indicatorRect.topLeft(), svgPixmap);
338 painter, QPen(activeColor, radioButtonIndicatorStrokeWidth), Qt::NoBrush,
339 adjusted(indicatorRect, -radioButtonIndicatorStrokeWidth / 2));
343 painter, QPen(option.palette.color(QPalette::Inactive, QPalette::Button),
344 checkBoxOrRadioButtonIndicatorStrokeWidth), option.palette.color(QPalette::Inactive, QPalette::Base),
345 adjusted(indicatorRect, -checkBoxOrRadioButtonIndicatorStrokeWidth));
351void drawLineEditBackground(QPainter &painter,
const QStyleOption &option)
353 auto radius =
std::min(
354 std::min(option.rect.size().width(), option.rect.size().height()) * 0.5, lineEditCornerRadius);
355 drawRoundedRect(painter, Qt::NoPen, option.palette.brush(QPalette::Base), option.rect, radius, radius);
358QBrush getPushButtonBackgroundBrush(
const QStyleOptionButton &option)
360 const auto isDefaultButton = option.features.testFlag(QStyleOptionButton::DefaultButton);
361 const auto isAutoDefaultButton = option.features.testFlag(QStyleOptionButton::AutoDefaultButton);
362 const auto isEnabled = option.state.testFlag(QStyle::State_Enabled);
363 const auto isOn = option.state.testFlag(QStyle::State_On);
365 const auto defaultButtonBackgroundColor = isEnabled
366 ? option.palette.color(QPalette::Active, QPalette::AlternateBase)
367 : makeInactiveOrDisabledFromColor(option.palette.color(QPalette::Active, QPalette::AlternateBase));
370 ? isDefaultButton || isAutoDefaultButton
371 ? defaultButtonBackgroundColor
372 : option.palette.color(QPalette::Active, QPalette::Dark)
374 ? defaultButtonBackgroundColor
375 : option.palette.brush(
378 : QPalette::Inactive,
382QColor getPushButtonTextColor(
const QStyleOptionButton &option)
384 const auto isEnabled = option.state.testFlag(QStyle::State_Enabled);
385 const auto isDefaultButton = option.features.testFlag(QStyleOptionButton::DefaultButton);
386 const auto isOn = option.state.testFlag(QStyle::State_On);
387 const QPalette *themePalette =
388 QGuiApplicationPrivate::platformTheme()->palette(QPlatformTheme::Palette::ButtonPalette);
390 return isDefaultButton || isOn
391 ? themePalette->color(QPalette::Active, QPalette::BrightText)
392 : themePalette->color(
395 : QPalette::Disabled,
396 QPalette::ButtonText);
399void drawPushButtonBackground(QPainter &painter,
const QStyleOptionButton &option)
401 paintOnStackTop(painter, [&](QPainter &painter) {
402 const auto isMouseOver = option.state.testFlag(QStyle::State_MouseOver);
403 const auto isSunken = option.state.testFlag(QStyle::State_Sunken);
405 painter.setRenderHints(QPainter::Antialiasing);
406 painter.setPen(Qt::NoPen);
408 auto adjustment = pushButtonFocusFrameGap + pushButtonFocusFrameWidth;
409 auto rect = option.rect.adjusted(adjustment, adjustment, -adjustment, -adjustment);
411 painter.setBrush(getPushButtonBackgroundBrush(option));
412 painter.drawRoundedRect(rect, pushButtonCornerRadius, pushButtonCornerRadius);
414 if (isMouseOver || isSunken) {
415 painter.setBrush(getSunkenOrHoverColor(isSunken, option.palette));
416 painter.drawRoundedRect(rect, pushButtonCornerRadius, pushButtonCornerRadius);
421void drawPushButtonFocus(QPainter &painter,
const QStyleOption &option)
423 paintOnStackTop(painter, [&](QPainter &painter) {
424 painter.setRenderHints(QPainter::Antialiasing);
425 painter.setBrush(Qt::NoBrush);
426 painter.setPen(QPen(option.palette.color(QPalette::Active, QPalette::Highlight), pushButtonFocusFrameWidth));
427 auto cornerRadius = pushButtonCornerRadius + pushButtonFocusFrameGap;
428 painter.drawRoundedRect(option.rect, cornerRadius, cornerRadius);
432QRect getProgressBarGrooveRect(
const QStyleOptionProgressBar &option)
434 auto rect = option.rect;
435 const bool horizontal = option.state & QStyle::State_Horizontal;
437 rect.setHeight(progressBarGrooveHeight);
438 rect.moveTop(option.rect.center().y());
440 rect.setWidth(progressBarGrooveHeight);
441 rect.moveRight(option.rect.center().x());
447void drawProgressBarContent(QPainter &painter,
const QStyleOptionProgressBar &option)
449 auto rect = getProgressBarGrooveRect(option);
450 const double fraction =
static_cast<
double>(option.progress - option.minimum) / (option.maximum - option.minimum);
451 const bool horizontal = option.state & QStyle::State_Horizontal;
453 rect.setWidth(fraction * rect.width());
454 rect.moveLeft(option.invertedAppearance ? option.rect.width() - rect.width() : 0);
456 rect.setHeight(fraction * rect.height());
457 rect.moveTop(option.invertedAppearance ? 0 : option.rect.height() - rect.height());
461 painter, Qt::NoPen, option.palette.brush(QPalette::Highlight), rect, progressBarCornerRadius,
462 progressBarCornerRadius);
465void drawSliderGroove(QPainter &painter,
const QStyleOptionSlider &option)
468 painter, Qt::NoPen, option.palette.color(QPalette::Active, QPalette::Mid),
469 option.rect, sliderCornerRadius, sliderCornerRadius);
472 if (option.orientation == Qt::Horizontal) {
473 const auto sliderPosition = QStyle::sliderPositionFromValue(
474 option.minimum, option.maximum, option.sliderPosition, option.rect.width(), option.upsideDown);
475 fillRect = QRect(option.rect.topLeft(), QSize(sliderPosition, option.rect.height()));
477 const auto sliderPosition = QStyle::sliderPositionFromValue(
478 option.minimum, option.maximum, option.sliderPosition, option.rect.height(), option.upsideDown);
480 option.rect.x(), option.rect.y() + sliderPosition, option.rect.width(), option.rect.height() - sliderPosition);
483 painter, Qt::NoPen, option.palette.brush(QPalette::Highlight), fillRect, sliderCornerRadius,
487void drawSliderThumb(QPainter &painter,
const QStyleOptionSlider &option)
489 QRect shadowRect(0, 0, shadowXSRadius, shadowXSRadius);
490 shadowRect.moveCenter(option.rect.center());
492 QRadialGradient radialGrad(shadowRect.center(), shadowXSRadius * 1.0);
493 radialGrad.setColorAt(0.0, Qt::transparent);
494 radialGrad.setColorAt(1.0, option.palette.color(QPalette::Active, QPalette::Shadow));
496 drawEllipse(painter, Qt::NoPen, QBrush(radialGrad), shadowRect);
498 if (option.state.testFlag(QStyle::State_MouseOver))
499 drawEllipse(painter, Qt::NoPen, option.palette.color(QPalette::Active, QPalette::Light), option.rect);
501 auto adjustedRect = option.rect.adjusted(sliderHoverSize, sliderHoverSize, -sliderHoverSize, -sliderHoverSize);
502 drawEllipse(painter, Qt::NoPen, option.palette.color(QPalette::Active, QPalette::AlternateBase), adjustedRect);
504 if (option.state.testFlag(QStyle::State_Sunken))
505 drawEllipse(painter, Qt::NoPen, option.palette.color(QPalette::Active, QPalette::Dark), adjustedRect);
507 if (option.state.testFlag(QStyle::State_HasFocus)) {
509 painter, QPen(option.palette.color(QPalette::Active, QPalette::Highlight), sliderFocusStrokeWidth),
510 Qt::NoBrush, adjusted(option.rect, -1));
514void drawToolButton(QPainter &painter,
const QStyleOption &option)
516 const auto isEnabled = option.state.testFlag(QStyle::State_Enabled);
517 const auto isMouseOver = option.state.testFlag(QStyle::State_MouseOver);
518 const auto isSunken = option.state.testFlag(QStyle::State_Sunken);
521 painter, Qt::NoPen, option.palette.brush(isEnabled ? QPalette::Active : QPalette::Disabled, QPalette::Button),
522 option.rect, toolButtonCornerRadius, toolButtonCornerRadius);
524 if (isMouseOver || isSunken) {
526 painter, Qt::NoPen, getSunkenOrHoverColor(isSunken, option.palette), option.rect, toolButtonCornerRadius,
527 toolButtonCornerRadius);
531void drawToolBarbackground(QPainter &painter,
const QStyleOption &option)
533 paintOnStackTop(painter, [&](QPainter &painter) {
534 painter.setRenderHints(QPainter::Antialiasing);
535 painter.fillRect(option.rect, option.palette.brush(QPalette::Active, QPalette::Window));
539void drawMenuBarBarbackground(QPainter &painter,
const QStyleOption &option)
541 paintOnStackTop(painter, [&](QPainter &painter) {
542 painter.setRenderHints(QPainter::Antialiasing);
543 painter.fillRect(option.rect, option.palette.brush(QPalette::Active, QPalette::Window));
547void drawListItemSeparator(QPainter &painter,
const QStyleOption &option)
549 QPoint center = option.rect.center();
551 painter, option.palette.color(QPalette::Active, QPalette::Mid),
552 QPoint(option.rect.left(), center.y()), QPoint(option.rect.right(), center.y()));
555void drawMenuItem(QPainter &painter,
const QStyleOptionMenuItem &option,
int checkMarkSize,
int iconSize)
557 const auto contentRect = option.rect.adjusted(itemViewItemHorizontalMargin, 0, -itemViewItemHorizontalMargin, 0);
558 if (option.menuItemType == QStyleOptionMenuItem::Separator) {
559 auto copyOption = option;
560 copyOption.rect = contentRect;
561 drawListItemSeparator(painter, copyOption);
563 const bool isSelected = option.state.testFlag(QStyle::State_Selected);
564 const bool isSunken = option.state.testFlag(QStyle::State_Sunken);
566 if (isSelected || isSunken) {
568 painter, Qt::NoPen, getSunkenOrHoverColor(isSunken, option.palette),
569 option.rect.adjusted(menuItemHoverHorizontalMargin, 0, -menuItemHoverHorizontalMargin, 0),
570 menuItemCornerRadius, menuItemCornerRadius);
573 const bool isCheckable = option.checkType != QStyleOptionMenuItem::NotCheckable;
576 checkMarkRect = contentRect;
577 checkMarkRect.setWidth(checkMarkSize);
579 auto copyOption = option;
580 copyOption.rect = checkMarkRect;
582 copyOption.state |= QStyle::State_On;
584 drawCheckBoxOrRadioButtonIndicator(painter, copyOption,
true);
587 const bool hasIcon = !option.icon.isNull();
590 iconRect = QRect(contentRect.x(), contentRect.center().y() - iconSize * 0.5, iconSize, iconSize);
591 iconRect.moveLeft(checkMarkRect.right() + itemViewItemHorizontalMargin);
594 &painter, iconRect, Qt::AlignCenter,
595 option.state.testFlag(QStyle::State_Enabled) ? QIcon::Normal : QIcon::Disabled,
596 option.checked ? QIcon::On : QIcon::Off);
599 QRect textRect = contentRect;
601 textRect.setLeft(checkMarkRect.right() + itemViewItemHorizontalMargin);
603 textRect.setLeft(iconRect.right() + itemViewItemHorizontalMargin);
604 paintOnStackTop(painter, [&](QPainter &painter) {
605 painter.setPen(option.palette.color(QPalette::Text));
607 textRect, (Qt::AlignLeft | Qt::AlignVCenter | Qt::TextShowMnemonic), option.text);
612void drawMenuTearOff(QPainter &painter,
const QStyleOption &option)
614 const auto pointY = option.rect.y() + option.rect.height() / 2;
616 painter, QPen(option.palette.color(QPalette::Text), 1, Qt::DashLine), QPoint(option.rect.x(), pointY),
617 QPoint(option.rect.x() + option.rect.width(), pointY)
621void drawSplitter(QPainter &painter,
const QStyleOption &option)
623 constexpr int splitterAvailableSizeDivider = 12;
624 const bool isHorizontal = option.state.testFlag(QStyle::State_Horizontal);
626 if (option.rect.width() > 1 && option.rect.height() > 1) {
627 const auto handleSize = isHorizontal
628 ? QSize(splitterHandleWidth, option.rect.height() / splitterAvailableSizeDivider)
629 : QSize(option.rect.width() / splitterAvailableSizeDivider, splitterHandleWidth);
630 const auto handleRect = QRect(
632 (option.rect.width() - handleSize.width()) * 0.5,
633 (option.rect.height() - handleSize.height()) * 0.5),
635 const auto cornerRadius =
std::min(handleSize.width(), handleSize.height()) * 0.5;
637 painter, Qt::NoPen, option.palette.color(QPalette::Active, QPalette::Mid),
638 handleRect, cornerRadius, cornerRadius);
640 auto endPoint = isHorizontal ? option.rect.bottomLeft() : option.rect.topRight();
641 drawLine(painter, option.palette.dark().color(), option.rect.topLeft(), endPoint);
645void drawSpinBoxFrame(
646 QPainter &painter,
const QStyleOptionSpinBox &option,
const QRect &frameRect,
int frameWidth)
648 auto isEnabled = option.state.testFlag(QStyle::State_Enabled);
651 option.frame && option.subControls.testFlag(QStyle::SC_SpinBoxFrame)
652 ? QPen(option.palette.color(QPalette::Active, QPalette::Mid), frameWidth)
655 paintOnStackTop(painter, [&](
auto &p) {
656 p.setOpacity(isEnabled ? 1.0 : ohos_id_alpha_disabled);
658 p, pen, option.palette.window(), frameRect, spinBoxFrameRadius, spinBoxFrameRadius);
662void drawSpinBoxButton(QPainter &painter,
const QStyleOptionSpinBox &option,
int penWidth)
664 auto rect = option.rect;
665 auto isEnabled = option.state.testFlag(QStyle::State_Enabled);
666 auto isPressed = option.state.testFlag(QStyle::State_Sunken);
668 QPen pen(option.palette.color(QPalette::Active, QPalette::Mid), penWidth);
669 QBrush brush(option.palette.window());
672 brush = QBrush(option.palette.highlight());
674 qreal rectX = rect.x();
675 qreal rectY = rect.y();
676 qreal rectWidth = rect.width();
677 qreal rectHeight = rect.height();
678 qreal cornerRadius =
static_cast<qreal>(spinBoxFrameRadius);
681 path.moveTo(rectX, rectY);
682 path.lineTo(rectX, rectY + rectHeight);
683 if (option.subControls == QStyle::SC_SpinBoxDown) {
684 path.lineTo(rectX + rectWidth - cornerRadius, rectY + rectHeight);
686 rectX + rectWidth - 2 * cornerRadius, rectY + rectHeight - 2 * cornerRadius,
687 2 * cornerRadius, 2 * cornerRadius, 270, 90);
688 path.lineTo(rectX + rectWidth, rectY);
690 path.lineTo(rectX + rectWidth, rectY + rectHeight);
691 path.lineTo(rectX + rectWidth, rectY + cornerRadius);
692 path.arcTo(rectX + rectWidth - 2 * cornerRadius, rectY, 2 * cornerRadius, 2 * cornerRadius, 0, 90);
696 paintOnStackTop(painter, [&](
auto &p) {
697 p.setOpacity(isEnabled ? 1.0 : ohos_id_alpha_disabled);
698 drawPath(p, pen, brush, path);
702void drawScrollBarSlider(QPainter &painter,
const QStyleOptionSlider &option)
704 int scrollBarRadius =
705 option.orientation == Qt::Vertical
706 ? option.rect.width() * 0.5
707 : option.rect.height() * 0.5;
709 paintOnStackTop(painter, [&](QPainter &painter) {
710 painter.setOpacity(ohos_id_alpha_content_tertiary);
712 painter, Qt::NoPen, option.palette.color(QPalette::Active, QPalette::Midlight),
713 option.rect, scrollBarRadius, scrollBarRadius);
717Qt::Orientation tabBarShapeToOrientation(QTabBar::Shape shape)
720 case QTabBar::RoundedNorth:
721 case QTabBar::RoundedSouth:
722 case QTabBar::TriangularNorth:
723 case QTabBar::TriangularSouth:
724 return Qt::Horizontal;
725 case QTabBar::RoundedWest:
726 case QTabBar::TriangularWest:
727 case QTabBar::RoundedEast:
728 case QTabBar::TriangularEast:
733void drawTabBarTabShape(QPainter &painter,
const QStyleOptionTab &option)
735 auto isSelected = option.state.testFlag(QStyle::State_Selected);
736 auto isFocused = option.state.testFlag(QStyle::State_HasFocus);
737 QRect rect(option.rect);
738 adjusted(rect, -tabBarTabFrameWidth - 1);
740 QPoint underLineStart, underLineEnd;
741 if (tabBarShapeToOrientation(option.shape) == Qt::Horizontal) {
742 int lineY = rect.y() + rect.height() - tabBarTabUnderLineWidth;
743 underLineStart = QPoint(rect.x() + tabBarTabRadius, lineY);
744 underLineEnd = QPoint(rect.x() + rect.width() - tabBarTabRadius, lineY);
746 int lineX = rect.x();
748 if (option.shape == QTabBar::RoundedWest || option.shape == QTabBar::TriangularWest)
749 lineX += rect.width() - tabBarTabUnderLineWidth;
751 lineX += tabBarTabUnderLineWidth;
753 underLineStart = QPoint(lineX, rect.y() + tabBarTabRadius);
754 underLineEnd = QPoint(lineX, rect.y() + rect.height() - tabBarTabRadius);
757 drawRoundedRect(painter, Qt::NoPen, option.palette.window(), rect, tabBarTabRadius, tabBarTabRadius);
758 if (!isFocused && isSelected)
759 drawLine(painter, QPen(option.palette.highlight(), tabBarTabUnderLineWidth), underLineStart, underLineEnd);
762void drawComboBoxFrame(QPainter &painter,
const QStyleOptionComboBox &option)
764 const auto isMouseOver = option.state.testFlag(QStyle::State_MouseOver);
765 const auto isOpened = option.state.testFlag(QStyle::State_On);
766 const auto isFocused = option.state.testFlag(QStyle::State_HasFocus);
768 auto focusedPen = QPen(
769 option.palette.color(QPalette::Active, QPalette::AlternateBase),
770 comboBoxFocusFrameWidth);
773 painter, isFocused ? focusedPen : Qt::NoPen, option.palette.brush(QPalette::Window), option.rect,
774 comboBoxFrameRadius, comboBoxFrameRadius);
776 if (isMouseOver || isOpened) {
777 auto pen = isOpened ? focusedPen : Qt::NoPen;
778 auto brush = getSunkenOrHoverColor(isOpened, option.palette);
779 drawRoundedRect(painter, pen, brush, option.rect, comboBoxFrameRadius, comboBoxFrameRadius);
783void drawComboBoxListViewItem(QPainter &painter,
const QStyleOptionViewItem &option,
const QBrush &brush)
785 if (isFirstItem(option.index)) {
787 painter, Qt::NoPen, brush, option.rect, focusFrameCornerRadius, focusFrameCornerRadius, 0, 0);
788 }
else if (isLastItem(option.index)) {
790 painter, Qt::NoPen, brush, option.rect, 0, 0, focusFrameCornerRadius, focusFrameCornerRadius);
792 drawRect(painter, Qt::NoPen, brush, option.rect);
796void drawTreeViewHighlightItem(QPainter &painter,
const QStyleOptionViewItem &option,
const QBrush &brush)
798 switch (option.viewItemPosition) {
799 case QStyleOptionViewItem::OnlyOne:
801 painter, Qt::NoPen, brush, option.rect, focusFrameCornerRadius, focusFrameCornerRadius);
803 case QStyleOptionViewItem::Beginning:
805 painter, Qt::NoPen, brush, option.rect, focusFrameCornerRadius, 0, focusFrameCornerRadius, 0);
807 case QStyleOptionViewItem::Invalid:
808 case QStyleOptionViewItem::Middle:
809 drawRect(painter, Qt::NoPen, brush, option.rect);
811 case QStyleOptionViewItem::End:
813 painter, Qt::NoPen, brush, option.rect, 0, focusFrameCornerRadius, 0, focusFrameCornerRadius);
818void drawPanelItemViewItem(QPainter &painter,
const QStyleOptionViewItem &option,
bool isComboBoxListViewItem)
820 if (isItemViewSeparator(option.index)) {
821 auto copyOption = option;
822 copyOption.rect = option.rect.adjusted(itemViewItemHorizontalMargin, 0, -itemViewItemHorizontalMargin, 0);
823 drawListItemSeparator(painter, copyOption);
825 auto isSelected = option.state.testFlag(QStyle::State_Selected);
826 auto isMouseOver = option.state.testFlag(QStyle::State_MouseOver);
828 auto colorGroup = option.state.testFlag(QStyle::State_Enabled) ? QPalette::Normal : QPalette::Disabled;
829 if (colorGroup == QPalette::Normal && !option.state.testFlag(QStyle::State_Active))
830 colorGroup = QPalette::Inactive;
834 ? option.palette.brush(colorGroup, QPalette::Highlight)
836 ? option.palette.color(QPalette::Active, QPalette::Light)
837 : option.backgroundBrush.style() == Qt::NoBrush
839 : option.backgroundBrush;
841 if (isComboBoxListViewItem)
842 drawComboBoxListViewItem(painter, option, brush);
844 drawTreeViewHighlightItem(painter, option, brush);
848void drawHeaderSection(QPainter &painter,
const QStyleOptionHeader &option)
851 option.position == QStyleOptionHeader::OnlyOneSection
853 : option.orientation == Qt::Horizontal
854 ? option.rect.adjusted(-1, 0, 0, 0)
855 : option.rect.adjusted(0, -1, 0, 0);
857 drawRect(painter, QPen(Qt::black), option.palette.brush(QPalette::Button), rect);
860void drawWindowBackgroundAndFrame(
861 QPainter &painter,
const QStyleOptionFrame &option, QFlags<Qt::WindowState> state,
int titleBarHeight)
863 const auto offset = option.lineWidth * 0.5;
864 const auto windowFrameColor =
865 state.testFlag(Qt::WindowActive)
866 ? option.palette.color(QPalette::Active, QPalette::Base)
867 : option.palette.color(QPalette::Inactive, QPalette::Base);
868 if (state.testFlag(Qt::WindowMinimized)) {
870 painter, QPen(windowFrameColor, option.lineWidth), Qt::NoBrush,
871 option.rect.adjusted(offset, offset, -offset, -offset), focusFrameCornerRadius, focusFrameCornerRadius, 0,
874 painter, Qt::NoPen, option.palette.brush(QPalette::Window),
875 option.rect.adjusted(option.lineWidth, titleBarHeight, -option.lineWidth, 0));
878 painter, Qt::NoPen, windowFrameColor, option.rect.adjusted(0, titleBarHeight, 0, 0), 0, 0,
879 focusFrameCornerRadius, focusFrameCornerRadius);
881 painter, Qt::NoPen, option.palette.brush(QPalette::Window),
882 option.rect.adjusted(option.lineWidth, titleBarHeight, -option.lineWidth, -option.lineWidth),
883 focusFrameCornerRadius, focusFrameCornerRadius);
885 painter, QPen(windowFrameColor, option.lineWidth), Qt::NoBrush,
886 option.rect.adjusted(offset, offset, -offset, -offset), focusFrameCornerRadius, focusFrameCornerRadius);
890void drawToolTip(QPainter &painter,
const QStyleOptionFrame &option)
893 painter, option.palette.color(QPalette::Active, QPalette::Base),
894 option.palette.toolTipBase(), option.rect, toolTipCornerRadius,
895 toolTipCornerRadius);
898QRect titleBarSubControlRect(
const QStyleOptionTitleBar &option, QCommonStyle::SubControl subControl)
900 const bool isMinimized = (option.titleBarState & Qt::WindowMinimized) != 0;
901 const bool isMaximized = (option.titleBarState & Qt::WindowMaximized) != 0;
903 const bool hasTitle = option.titleBarFlags.testFlag(Qt::WindowTitleHint);
904 const bool hasSystemMenuButton = option.titleBarFlags.testFlag(Qt::WindowSystemMenuHint);
905 const bool hasShadeButton = option.titleBarFlags.testFlag(Qt::WindowShadeButtonHint);
906 const bool hasContextHelpButton = option.titleBarFlags.testFlag(Qt::WindowContextHelpButtonHint);
907 const bool hasMinimizeButton = option.titleBarFlags.testFlag(Qt::WindowMinimizeButtonHint);
908 const bool hasMaximizeButton = option.titleBarFlags.testFlag(Qt::WindowMaximizeButtonHint);
910 const auto controlSize = QSize(30, 30);
911 const int titleBarHorizontalMargin = 25;
912 const int titleBarControlVerticalMargin = 15;
914 const auto titleBarContentRect = QRect(
915 option.rect.x() + titleBarHorizontalMargin, (option.rect.height() - controlSize.height()) / 2,
916 option.rect.width() - 2 * titleBarHorizontalMargin, controlSize.height());
917 const auto titleBarContentRectRight = titleBarContentRect.x() + titleBarContentRect.width();
918 const auto delta = controlSize.width() + titleBarControlVerticalMargin;
921 switch (subControl) {
922 case QCommonStyle::SC_TitleBarSysMenu:
923 if (hasSystemMenuButton)
924 result = QRect(titleBarContentRect.topLeft(), controlSize);
926 case QCommonStyle::SC_TitleBarLabel:
928 result = titleBarContentRect;
929 if (hasSystemMenuButton)
930 result.adjust(delta, 0, -delta, 0);
931 if (hasMinimizeButton)
932 result.adjust(0, 0, -delta, 0);
933 if (hasMaximizeButton)
934 result.adjust(0, 0, -delta, 0);
936 result.adjust(0, 0, -delta, 0);
937 if (hasContextHelpButton)
938 result.adjust(0, 0, -delta, 0);
941 case QCommonStyle::SC_TitleBarMaxButton:
942 if (!isMaximized && hasMaximizeButton) {
944 QPoint(titleBarContentRectRight - 3 * delta + titleBarControlVerticalMargin,
945 titleBarContentRect.y()), controlSize);
948 case QCommonStyle::SC_TitleBarNormalButton:
949 if (isMinimized && hasMinimizeButton) {
951 QPoint(titleBarContentRectRight - 2 * delta + titleBarControlVerticalMargin,
952 titleBarContentRect.y()), controlSize);
953 }
else if (isMaximized && hasMaximizeButton) {
955 QPoint(titleBarContentRectRight - 3 * delta + titleBarControlVerticalMargin,
956 titleBarContentRect.y()), controlSize);
959 case QCommonStyle::SC_TitleBarMinButton:
960 if (!isMinimized && hasMinimizeButton) {
962 QPoint(titleBarContentRectRight - 2 * delta + titleBarControlVerticalMargin,
963 titleBarContentRect.y()), controlSize);
966 case QCommonStyle::SC_TitleBarCloseButton:
968 QPoint(titleBarContentRectRight - controlSize.width(), titleBarContentRect.y()), controlSize);
970 case QCommonStyle::SC_TitleBarShadeButton:
971 case QCommonStyle::SC_TitleBarUnshadeButton:
973 QPoint(titleBarContentRectRight - 4 * delta + titleBarControlVerticalMargin,
974 titleBarContentRect.y()), controlSize);
976 case QCommonStyle::SC_TitleBarContextHelpButton:
978 QPoint(titleBarContentRectRight - (hasShadeButton ? 5 : 4) * delta + titleBarControlVerticalMargin,
979 titleBarContentRect.y()), controlSize);
990QOhosStyle::QOhosStyle()
995void QOhosStyle::drawPrimitive(
996 PrimitiveElement element,
const QStyleOption *option, QPainter *painter,
const QWidget *widget)
const
1000 if (widget !=
nullptr && qobjectIsInstanceOf<QComboBox>(widget->parent()))
1002 QCommonStyle::drawPrimitive(element, option, painter, widget);
1005 case PE_FrameWindow:
1006 if (qStyleOptionIs<QStyleOptionFrame>(option)) {
1007 drawWindowBackgroundAndFrame(
1008 *painter, *qstyleoption_cast<
const QStyleOptionFrame *>(option), widget->windowState(),
1009 pixelMetric(PM_TitleBarHeight, option, widget));
1012 case PE_FrameFocusRect:
1013 if (
const QStyleOptionFocusRect *fropt = qstyleoption_cast<
const QStyleOptionFocusRect *>(option)) {
1014 if (qobjectIsInstanceOf<QPushButton>(widget)) {
1015 drawPushButtonFocus(*painter, *option);
1016 }
else if (qobjectIsInstanceOf<QToolButton>(widget)) {
1017 const auto menuButtonIndicatorSize =
1018 qobject_cast<
const QToolButton *>(widget)->popupMode() == QToolButton::MenuButtonPopup
1019 ? pixelMetric(PM_MenuButtonIndicator, option, widget)
1023 QPen(option->palette.color(QPalette::Active, QPalette::Highlight), toolButtonFocusFrameWidth),
1024 Qt::NoBrush, option->rect.adjusted(-1, -1, 1 + menuButtonIndicatorSize, 1),
1025 toolButtonCornerRadius, toolButtonCornerRadius);
1026 }
else if (qobjectIsInstanceOf<QCheckBox>(widget) || qobjectIsInstanceOf<QRadioButton>(widget)) {
1028 *painter, QPen(option->palette.color(QPalette::Active, QPalette::Button),
1029 checkBoxOrRadioButtonFocusStrokeWidth), Qt::NoBrush, option->rect);
1030 }
else if (qobjectIsInstanceOf<QTabBar>(widget)) {
1032 *painter, QPen(option->palette.highlight(), tabBarTabFrameWidth), Qt::NoBrush,
1033 option->rect, tabBarTabRadius, tabBarTabRadius);
1036 *painter, QPen(option->palette.color(QPalette::Active, QPalette::Highlight), focusFrameWidth),
1037 Qt::NoBrush, option->rect, focusFrameCornerRadius, focusFrameCornerRadius);
1041 case PE_PanelButtonCommand:
1042 if (qStyleOptionIs<QStyleOptionButton>(option))
1043 drawPushButtonBackground(*painter, *qstyleoption_cast<
const QStyleOptionButton *>(option));
1045 case PE_PanelButtonTool:
1046 if (qobjectIsInstanceOf<QMdiSubWindow>(widget)) {
1047 const QPalette *toolButtonThemePalette =
1048 QGuiApplicationPrivate::platformTheme()->palette(QPlatformTheme::Palette::ToolButtonPalette);
1049 const auto panelButtonColor =
1050 toolButtonThemePalette->color(QPalette::Active, QPalette::AlternateBase);
1052 *painter, Qt::NoPen,
1053 widget->windowState().testFlag(Qt::WindowActive)
1055 : makeInactiveOrDisabledFromColor(panelButtonColor),
1058 const QToolButton *toolButton = qobject_cast<
const QToolButton *>(widget);
1059 const auto menuButtonIndicatorSize =
1060 toolButton !=
nullptr && toolButton->popupMode() == QToolButton::MenuButtonPopup
1061 ? pixelMetric(PM_MenuButtonIndicator, option, widget)
1063 auto optionCopy = *option;
1064 optionCopy.rect.setWidth(option->rect.width() + menuButtonIndicatorSize);
1065 drawToolButton(*painter, optionCopy);
1068 case PE_PanelMenuBar:
1069 drawMenuBarBarbackground(*painter, *option);
1071 case PE_IndicatorCheckBox:
1072 drawCheckBoxOrRadioButtonIndicator(*painter, *option,
true);
1074 case PE_IndicatorRadioButton:
1075 drawCheckBoxOrRadioButtonIndicator(*painter, *option,
false);
1077 case PE_PanelLineEdit: {
1080 if (widget !=
nullptr && qobjectIsInstanceOf<QAbstractSpinBox>(widget->parentWidget()))
1087 if (widget !=
nullptr && qobjectIsInstanceOf<QComboBox>(widget->parentWidget()))
1093 auto optionCopy = *option;
1094 if (widget !=
nullptr && qstrcmp(widget->metaObject()->className(),
"QExpandingLineEdit") == 0) {
1095 optionCopy.palette.setColor(
1097 option->palette.color(QPalette::Active, QPalette::AlternateBase));
1100 drawLineEditBackground(*painter, optionCopy);
1103 case PE_PanelButtonBevel:
1104 if (qStyleOptionIs<QStyleOptionSpinBox>(option)) {
1106 *painter, *qstyleoption_cast<
const QStyleOptionSpinBox *>(option),
1107 pixelMetric(PM_SpinBoxFrameWidth, option, widget));
1110 case PE_IndicatorSpinDown:
1111 case PE_IndicatorSpinUp: {
1114 QRect indicatorRect = option->rect.adjusted(1, 2, 0, -2);
1115 constexpr int arrowWidth = 2;
1116 auto x = indicatorRect.x();
1117 auto y = indicatorRect.y();
1118 auto width = indicatorRect.width();
1119 auto height = indicatorRect.height();
1120 auto verticalSpacing = 4;
1121 auto horizontalSpacing = 7;
1123 qreal x1 = x + horizontalSpacing;
1124 qreal x2 = x + width * 0.5;
1125 qreal x3 = x + width - horizontalSpacing;
1128 if (element == PE_IndicatorSpinDown) {
1129 y1 = y + verticalSpacing;
1130 y2 = y + height - verticalSpacing;
1132 y1 = y + height - verticalSpacing;
1133 y2 = y + verticalSpacing;
1137 QPen indicatorPen(option->palette.color(QPalette::Active, QPalette::Text), arrowWidth);
1138 indicatorPen.setCapStyle(Qt::RoundCap);
1139 indicatorPen.setJoinStyle(Qt::RoundJoin);
1141 paintOnStackTop(*painter, [&](
auto &p) {
1142 p.setOpacity(option->state.testFlag(State_Enabled) ? 1.0 : ohos_id_alpha_disabled);
1143 p.setRenderHint(QPainter::Antialiasing);
1144 p.setPen(indicatorPen);
1145 p.setBrush(Qt::NoBrush);
1146 p.drawLine(x1, y1, x2, y2);
1147 p.drawLine(x2, y2, x3, y3);
1151 case PE_FrameGroupBox: {
1152 const auto frame = qstyleoption_cast<
const QStyleOptionFrame *>(option);
1153 if (frame !=
nullptr) {
1155 pen.setColor(frame->palette.alternateBase().color());
1157 frame->features.testFlag(QStyleOptionFrame::FrameFeature::Flat)
1158 ? Qt::NoPen : Qt::SolidLine);
1160 painter->setClipRegion(frame->rect);
1162 *painter, pen, option->palette.window(), frame->rect, groupBoxFrameCornerRadius,
1163 groupBoxFrameCornerRadius);
1167 case PE_IndicatorArrowUp:
1168 case PE_IndicatorArrowDown:
1169 case PE_IndicatorArrowLeft:
1170 case PE_IndicatorArrowRight: {
1171 QRect availableRect;
1172 int maxArrowSize = 0;
1173 if (qobjectIsInstanceOf<QToolButton>(widget) || qobjectIsInstanceOf<QPushButton>(widget)
1174 || qobjectIsInstanceOf<QComboBox>(widget)) {
1175 const auto menuButtonIndicatorSize = pixelMetric(PM_MenuButtonIndicator, option, widget);
1176 availableRect = QRect(
1177 widget->size().width() - menuButtonIndicatorSize, 0, menuButtonIndicatorSize, widget->size().height());
1178 maxArrowSize = std::min(availableRect.width(), availableRect.height()) * 0.5;
1180 availableRect = option->rect;
1181 maxArrowSize = std::min(availableRect.width(), availableRect.height());
1184 const auto arrowWidth = 2;
1185 auto arrowRect = QRect(0, 0, maxArrowSize, maxArrowSize * 0.5);
1186 arrowRect.moveCenter(availableRect.center());
1187 arrowRect = adjusted(arrowRect, -arrowWidth * 0.5);
1189 const std::vector<QPointF> polygonPoints = {
1190 QPointF(arrowRect.x(), arrowRect.y()),
1191 QPointF(arrowRect.x() + arrowRect.width() * 0.5, arrowRect.y() + arrowRect.height()),
1192 QPointF(arrowRect.x() + arrowRect.width(), arrowRect.y())
1194 const auto isEnabled = option->state.testFlag(QStyle::State_Enabled);
1196 paintOnStackTop(*painter, [&](
auto &p) {
1197 p.translate(option->rect.center());
1200 case PE_IndicatorArrowDown:
1202 case PE_IndicatorArrowUp:
1205 case PE_IndicatorArrowLeft:
1208 case PE_IndicatorArrowRight:
1212 p.translate(-option->rect.center());
1214 p.setOpacity(isEnabled ? 1.0 : ohos_id_alpha_disabled);
1218 option->palette.color(QPalette::Active, QPalette::WindowText),
1219 arrowWidth, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin), Qt::NoBrush,
1224 case PE_IndicatorButtonDropDown: {
1225 if (qobjectIsInstanceOf<QToolButton>(widget))
1227 QCommonStyle::drawPrimitive(element, option, painter, widget);
1230 case PE_PanelItemViewItem:
1231 if (qStyleOptionIs<QStyleOptionViewItem>(option)) {
1232 drawPanelItemViewItem(
1233 *painter, *qstyleoption_cast<
const QStyleOptionViewItem *>(option),
1234 widget !=
nullptr && qstrcmp(widget->metaObject()->className(),
"QComboBoxListView") == 0);
1237 case PE_FrameTabWidget:
1238 if (qStyleOptionIs<QStyleOptionTabWidgetFrame>(option)) {
1239 QRect rect = option->rect;
1241 switch (qstyleoption_cast<
const QStyleOptionTabWidgetFrame *>(option)->shape) {
1242 case QTabBar::RoundedNorth:
1243 case QTabBar::TriangularNorth:
1244 rect.adjust(0, tabWidgetFrameWidth, 0, 0);
1246 case QTabBar::RoundedWest:
1247 case QTabBar::TriangularWest:
1248 rect.adjust(tabWidgetFrameWidth, 0, 0, 0);
1250 case QTabBar::RoundedSouth:
1251 case QTabBar::TriangularSouth:
1252 rect.adjust(0, 0, 0, -(tabWidgetFrameWidth * 2));
1254 case QTabBar::RoundedEast:
1255 case QTabBar::TriangularEast:
1256 rect.adjust(0, 0, -(tabWidgetFrameWidth * 2), 0);
1261 *painter, QPen(option->palette.color(QPalette::Dark), tabWidgetFrameWidth),
1265 case PE_PanelTipLabel:
1266 if (qStyleOptionIs<QStyleOptionFrame>(option))
1267 drawToolTip(*painter, *qstyleoption_cast<
const QStyleOptionFrame *>(option));
1270 QCommonStyle::drawPrimitive(element, option, painter, widget);
1275void QOhosStyle::drawControl(
1276 ControlElement element,
const QStyleOption *option, QPainter *painter,
const QWidget *widget)
const
1279 case CE_HeaderSection:
1280 if (qStyleOptionIs<QStyleOptionHeader>(option))
1281 drawHeaderSection(*painter, *qstyleoption_cast<
const QStyleOptionHeader *>(option));
1283 case CE_MenuBarEmptyArea:
1286 if (qStyleOptionIs<QStyleOptionMenuItem>(option)) {
1287 const auto *menuItemStyleOption = qstyleoption_cast<
const QStyleOptionMenuItem *>(option);
1289 *painter, *menuItemStyleOption, pixelMetric(PM_IndicatorWidth, option, widget),
1290 pixelMetric(PM_SmallIconSize, option, widget));
1291 if (menuItemStyleOption->menuItemType == QStyleOptionMenuItem::SubMenu) {
1292 const auto iconSize = pixelMetric(PM_SmallIconSize, option, widget);
1293 const auto menuItemRect = menuItemStyleOption->rect;
1295 QStyleOptionMenuItem menuArrowStyleOption = *menuItemStyleOption;
1296 menuArrowStyleOption.rect = QRect(
1297 menuItemRect.right() - itemViewItemHorizontalMargin - iconSize,
1298 menuItemRect.top() + (menuItemRect.height() - iconSize) / 2, iconSize, iconSize);
1299 QColor arrowColor = menuItemStyleOption->palette.color(QPalette::Active, QPalette::Text);
1300 menuArrowStyleOption.palette.setColor(
1301 QPalette::Active, QPalette::WindowText, arrowColor);
1303 menuArrowStyleOption.direction == Qt::RightToLeft ? PE_IndicatorArrowLeft : PE_IndicatorArrowRight,
1304 &menuArrowStyleOption, painter, widget);
1308 case CE_MenuTearoff:
1309 drawMenuTearOff(*painter, *option);
1311 case CE_ProgressBarGroove:
1312 if (qstyleoption_cast<
const QStyleOptionProgressBar *>(option)) {
1314 *painter, Qt::NoPen, option->palette.color(QPalette::Active, QPalette::Mid),
1315 getProgressBarGrooveRect(*qstyleoption_cast<
const QStyleOptionProgressBar *>(option)),
1316 progressBarCornerRadius, progressBarCornerRadius);
1319 case CE_ProgressBarContents:
1320 if (qstyleoption_cast<
const QStyleOptionProgressBar *>(option))
1321 drawProgressBarContent(*painter, *qstyleoption_cast<
const QStyleOptionProgressBar *>(option));
1323 case CE_ProgressBarLabel:
1326 drawSplitter(*painter, *option);
1329 drawToolBarbackground(*painter, *option);
1331 case CE_ScrollBarSlider:
1332 if (qStyleOptionIs<QStyleOptionSlider>(option))
1333 drawScrollBarSlider(*painter, *qstyleoption_cast<
const QStyleOptionSlider *>(option));
1335 case CE_TabBarTabShape: {
1336 auto tabOption = qstyleoption_cast<
const QStyleOptionTab *>(option);
1337 if (tabOption !=
nullptr)
1338 drawTabBarTabShape(*painter, *tabOption);
1341 case CE_TabBarTabLabel: {
1342 auto tabOption = qstyleoption_cast<
const QStyleOptionTab *>(option);
1343 if (tabOption !=
nullptr) {
1344 auto copy = *tabOption;
1345 if (!option->state.testFlag(State_Selected))
1346 copy.palette.setCurrentColorGroup(QPalette::Inactive);
1347 QCommonStyle::drawControl(element, ©, painter, widget);
1351 case CE_PushButtonLabel: {
1352 if (qStyleOptionIs<QStyleOptionButton>(option)) {
1353 auto buttonOption = qstyleoption_cast<
const QStyleOptionButton *>(option);
1355 auto buttonOptionCopy = *buttonOption;
1356 buttonOptionCopy.palette.setColor(QPalette::ButtonText, getPushButtonTextColor(*buttonOption));
1358 QCommonStyle::drawControl(element, &buttonOptionCopy, painter, widget);
1362 case CE_DockWidgetTitle: {
1363 const auto *dockWidgetOption = qstyleoption_cast<
const QStyleOptionDockWidget *>(option);
1364 if (dockWidgetOption ==
nullptr)
1366 auto dockWidgetOptionCopy = *dockWidgetOption;
1367 if (!dockWidgetOptionCopy.title.isEmpty()) {
1368 QRect titleRect = subElementRect(SE_DockWidgetTitleBarText, option, widget);
1369 if (dockWidgetOptionCopy.verticalTitleBar) {
1370 QRect rect = dockWidgetOptionCopy.rect;
1371 QRect verticalRect = rect.transposed();
1373 verticalRect.left() + rect.bottom() - titleRect.bottom(),
1374 verticalRect.top() + titleRect.left() - rect.left(),
1378 dockWidgetOptionCopy.title = painter->fontMetrics().elidedText(
1379 dockWidgetOptionCopy.title, Qt::ElideRight, titleRect.width());
1381 QCommonStyle::drawControl(element, &dockWidgetOptionCopy, painter, widget);
1385 QCommonStyle::drawControl(element, option, painter, widget);
1389void QOhosStyle::drawComplexControl(
1390 ComplexControl control,
const QStyleOptionComplex *option, QPainter *painter,
const QWidget *widget)
const
1394 const auto sliderStyleOption = qstyleoption_cast<
const QStyleOptionSlider *>(option);
1395 if (sliderStyleOption !=
nullptr) {
1396 if (option->subControls.testFlag(SC_SliderGroove)) {
1397 auto sliderStyleOptionCopy = *sliderStyleOption;
1398 sliderStyleOptionCopy.rect = subControlRect(control, option, SC_SliderGroove, widget);
1399 drawSliderGroove(*painter, sliderStyleOptionCopy);
1401 if (option->subControls.testFlag(SC_SliderHandle)) {
1402 auto sliderStyleOptionCopy = *sliderStyleOption;
1403 sliderStyleOptionCopy.rect = subControlRect(control, option, SC_SliderHandle, widget);
1404 drawSliderThumb(*painter, sliderStyleOptionCopy);
1410 if (qStyleOptionIs<QStyleOptionSpinBox>(option)) {
1411 auto spinBox = qstyleoption_cast<
const QStyleOptionSpinBox *>(option);
1412 auto frameRect = subControlRect(control, spinBox, SC_SpinBoxFrame, widget);
1413 auto frameWidth = pixelMetric(PM_SpinBoxFrameWidth, spinBox, widget);
1414 drawSpinBoxFrame(*painter, *spinBox, frameRect, frameWidth);
1416 auto copy = *spinBox;
1419 QCommonStyle::drawComplexControl(control, ©, painter, widget);
1422 case CC_ScrollBar: {
1423 const auto scrollBarStyleOption = qstyleoption_cast<
const QStyleOptionSlider *>(option);
1424 if (scrollBarStyleOption !=
nullptr) {
1425 if (option->subControls.testFlag(SC_ScrollBarSlider)) {
1426 auto scrollBarStyleOptionCopy = *scrollBarStyleOption;
1427 scrollBarStyleOptionCopy.rect = subControlRect(control, option, SC_ScrollBarSlider, widget);
1428 drawControl(CE_ScrollBarSlider, &scrollBarStyleOptionCopy, painter, widget);
1434 const auto groupBox = qstyleoption_cast<
const QStyleOptionGroupBox *>(option);
1435 if (groupBox !=
nullptr) {
1436 auto groupBoxCopy = *groupBox;
1437 groupBoxCopy.textAlignment |= Qt::AlignVCenter;
1439 const auto colorGroup = option->state.testFlag(QStyle::State_Enabled)
1441 : QPalette::Disabled;
1442 if (!groupBoxCopy.palette.isBrushSet(colorGroup, QPalette::WindowText))
1443 groupBoxCopy.textColor = groupBoxCopy.palette.color(QPalette::Text);
1445 QCommonStyle::drawComplexControl(control, &groupBoxCopy, painter, widget);
1450 if (qStyleOptionIs<QStyleOptionComboBox>(option)) {
1451 const auto comboBoxStyleOption = qstyleoption_cast<
const QStyleOptionComboBox *>(option);
1452 if (option->subControls.testFlag(SC_ComboBoxFrame)) {
1453 auto comboBoxStyleOptionCopy = *comboBoxStyleOption;
1454 comboBoxStyleOptionCopy.rect = subControlRect(control, option, SC_ComboBoxFrame, widget);
1455 drawComboBoxFrame(*painter, comboBoxStyleOptionCopy);
1458 if (option->subControls.testFlag(SC_ComboBoxArrow)) {
1459 auto optionCopy = *option;
1460 auto comboBoxOptions =
static_cast<QStyleOption *>(&optionCopy);
1461 comboBoxOptions->rect = subControlRect(control, option, SC_ComboBoxArrow, widget);
1462 drawPrimitive(PE_IndicatorArrowDown, comboBoxOptions, painter, widget);
1465 QCommonStyle::drawComplexControl(control, option, painter, widget);
1470 QCommonStyle::drawComplexControl(control, option, painter, widget);
1474QRect QOhosStyle::subControlRect(
1475 ComplexControl control,
const QStyleOptionComplex *option, SubControl subControl,
const QWidget *widget)
const
1479 if (qStyleOptionIs<QStyleOptionSlider>(option)) {
1480 const auto sliderStyleOption = qstyleoption_cast<
const QStyleOptionSlider *>(option);
1481 switch (subControl) {
1482 case SC_SliderGroove: {
1483 const auto sliderLengthOffset = pixelMetric(PM_SliderLength, option, widget) * 0.5;
1484 auto grooveRect = QCommonStyle::subControlRect(control, option, subControl, widget);
1486 if (sliderStyleOption->orientation == Qt::Horizontal) {
1487 grooveRect.adjust(sliderLengthOffset, 0, -sliderLengthOffset, 0);
1488 grooveRect.setHeight(sliderGrooveHeight);
1489 grooveRect.moveTop(option->rect.center().y() - sliderGrooveHeight * 0.5);
1491 grooveRect.adjust(0, sliderLengthOffset, 0, -sliderLengthOffset);
1492 grooveRect.setWidth(sliderGrooveHeight);
1493 grooveRect.moveLeft(option->rect.center().x() - sliderGrooveHeight * 0.5);
1498 case SC_SliderHandle: {
1499 auto handleRect = QCommonStyle::subControlRect(control, option, subControl, widget);
1500 if (sliderStyleOption->orientation == Qt::Horizontal)
1501 handleRect.moveTop(option->rect.center().y() - handleRect.height() * 0.5);
1503 handleRect.moveLeft(option->rect.center().x() - handleRect.width() * 0.5);
1507 return QCommonStyle::subControlRect(control, option, subControl, widget);
1510 return QCommonStyle::subControlRect(control, option, subControl, widget);
1513 if (qStyleOptionIs<QStyleOptionSpinBox>(option)) {
1514 const auto spinBox = qstyleoption_cast<
const QStyleOptionSpinBox *>(option);
1515 auto frameWidth = spinBox->frame ? pixelMetric(PM_SpinBoxFrameWidth, option, widget) : 0;
1517 switch (subControl) {
1518 case SC_SpinBoxFrame: {
1519 auto frameRect = spinBox->rect;
1520 frameRect.setHeight(spinBoxFrameHeight);
1521 frameRect.moveCenter(spinBox->rect.center());
1522 return visualRect(spinBox->direction, spinBox->rect, frameRect);
1524 case SC_SpinBoxDown:
1525 case SC_SpinBoxUp: {
1526 auto frameRect = subControlRect(CC_SpinBox, option, SC_SpinBoxFrame, widget);
1527 if (spinBox->buttonSymbols == QAbstractSpinBox::NoButtons)
1529 auto buttonRect = QRect(
1530 frameRect.left() + frameRect.width() - spinBoxButtonBoxWidth,
1531 frameRect.top() + (frameRect.height() - spinBoxFrameHeight) * 0.5,
1532 spinBoxButtonBoxWidth, spinBoxButtonBoxHeight);
1533 if (subControl == SC_SpinBoxDown)
1534 buttonRect.translate(0, spinBoxButtonBoxHeight);
1535 return visualRect(spinBox->direction, frameRect, buttonRect);
1537 case SC_SpinBoxEditField: {
1538 auto editRect = adjusted(spinBox->rect, -frameWidth);
1539 if (spinBox->buttonSymbols != QAbstractSpinBox::NoButtons) {
1540 editRect.setWidth(spinBox->rect.width() - frameWidth - spinBoxButtonBoxWidth);
1541 editRect = visualRect(spinBox->direction, spinBox->rect, editRect);
1546 return QCommonStyle::subControlRect(control, option, subControl, widget);
1549 return QCommonStyle::subControlRect(control, option, subControl, widget);
1552 if (qStyleOptionIs<QStyleOptionSlider>(option)) {
1553 auto scrollBoxStyleOption = qstyleoption_cast<
const QStyleOptionSlider *>(option);
1554 auto defaultUpButtonRect = QCommonStyle::subControlRect(control, option, SC_ScrollBarSubLine, widget);
1555 auto defaultDownButtonRect = QCommonStyle::subControlRect(control, option, SC_ScrollBarAddLine, widget);
1556 switch (subControl) {
1557 case SC_ScrollBarAddLine:
1558 case SC_ScrollBarSubLine:
1560 case SC_ScrollBarSubPage: {
1561 auto subPageRect = QCommonStyle::subControlRect(control, option, subControl, widget);
1562 if (scrollBoxStyleOption->orientation == Qt::Vertical)
1563 subPageRect.moveTop(subPageRect.top() - defaultDownButtonRect.height());
1565 subPageRect.moveLeft(subPageRect.left() - defaultDownButtonRect.width());
1568 case SC_ScrollBarAddPage: {
1569 auto addPageRect = QCommonStyle::subControlRect(control, option, subControl, widget);
1570 if (scrollBoxStyleOption->orientation == Qt::Vertical)
1571 addPageRect.moveTop(addPageRect.top() + defaultUpButtonRect.height());
1573 addPageRect.moveLeft(addPageRect.left() + defaultUpButtonRect.width());
1576 case SC_ScrollBarSlider: {
1577 const bool activeScrollBar =
1578 option->state.testFlag(QCommonStyle::State_Enabled)
1579 && option->state.testFlag(QCommonStyle::State_MouseOver);
1580 auto scrollBarExtent = activeScrollBar ? thickScrollBarSize : thinScrollBarSize;
1582 auto sliderRect = QCommonStyle::subControlRect(control, option, subControl, widget);
1583 if (scrollBoxStyleOption->orientation == Qt::Vertical) {
1584 sliderRect.setWidth(scrollBarExtent);
1585 sliderRect.setHeight(sliderRect.height() + defaultUpButtonRect.height() + defaultDownButtonRect.height());
1586 sliderRect.moveTop(sliderRect.top() - defaultUpButtonRect.height());
1587 sliderRect.moveLeft((option->rect.width() - sliderRect.width()) * 0.5);
1589 sliderRect.setHeight(scrollBarExtent);
1590 sliderRect.setWidth(sliderRect.width() + defaultUpButtonRect.width() + defaultDownButtonRect.width());
1591 sliderRect.moveTop((option->rect.height() - sliderRect.height()) * 0.5);
1592 sliderRect.moveLeft(sliderRect.left() - defaultUpButtonRect.width());
1597 return QCommonStyle::subControlRect(control, option, subControl, widget);
1600 return QCommonStyle::subControlRect(control, option, subControl, widget);
1603 if (qStyleOptionIs<QStyleOptionGroupBox>(option)) {
1604 auto groupBox = qstyleoption_cast<
const QStyleOptionGroupBox *>(option);
1606 QCommonStyle::subControlRect(control, option, SC_GroupBoxLabel, widget);
1607 if (groupBox->text.isEmpty()) {
1608 labelRect.moveTop(groupBox->rect.top() + groupBoxTopPadding);
1609 labelRect.moveBottom(labelRect.top());
1611 labelRect.moveTop(groupBox->rect.top() + groupBoxTopPadding + groupBoxTitleTextFontSize / 2);
1614 switch (subControl) {
1615 case SC_GroupBoxFrame:
1616 return QCommonStyle::subControlRect(control, option, subControl, widget);
1617 case SC_GroupBoxLabel: {
1620 case SC_GroupBoxCheckBox: {
1622 QCommonStyle::subControlRect(control, option, subControl, widget);
1623 checkBoxRect.moveTop(labelRect.center().y() - checkBoxRect.height() / 2);
1624 return checkBoxRect;
1626 case SC_GroupBoxContents: {
1628 QCommonStyle::subControlRect(control, option, SC_GroupBoxContents, widget);
1629 contentsRect.setTop(labelRect.bottom() + (groupBox->text.isEmpty() ? 0 : groupBoxTitleToContentSpacing));
1630 contentsRect.setBottom(groupBox->rect.bottom() - groupBoxBottomPadding);
1631 contentsRect.adjust(groupBoxHorizontalPadding, 0, -groupBoxHorizontalPadding, 0);
1632 return contentsRect;
1635 return QCommonStyle::subControlRect(control, option, subControl, widget);
1638 return QCommonStyle::subControlRect(control, option, subControl, widget);
1641 if (qStyleOptionIs<QStyleOptionComboBox>(option)) {
1642 auto comboBoxStyleOption = qstyleoption_cast<
const QStyleOptionComboBox *>(option);
1643 const auto arrowSize = pixelMetric(PM_MenuButtonIndicator, option, widget);
1644 switch (subControl) {
1645 case SC_ComboBoxFrame: {
1646 return adjusted(comboBoxStyleOption->rect, -comboBoxFocusFrameWidth);;
1648 case SC_ComboBoxEditField: {
1649 return comboBoxStyleOption->rect.adjusted(
1650 comboBoxFrameLeftRightPadding, comboBoxVerticalMargin,
1651 -arrowSize - comboBoxFrameLeftRightPadding, -comboBoxVerticalMargin);
1653 case SC_ComboBoxArrow: {
1654 auto arrowIconRect = comboBoxStyleOption->rect;
1655 arrowIconRect.setWidth(arrowSize);
1656 arrowIconRect.moveRight(comboBoxStyleOption->rect.width());
1657 return arrowIconRect;
1660 return QCommonStyle::subControlRect(control, option, subControl, widget);
1663 return QCommonStyle::subControlRect(control, option, subControl, widget);
1666 if (qStyleOptionIs<QStyleOptionTitleBar>(option)) {
1667 auto titleBarOption = qstyleoption_cast<
const QStyleOptionTitleBar *>(option);
1669 titleBarOption->direction, titleBarOption->rect, titleBarSubControlRect(*titleBarOption, subControl));
1671 return QCommonStyle::subControlRect(control, option, subControl, widget);
1674 return QCommonStyle::subControlRect(control, option, subControl, widget);
1678QRect QOhosStyle::subElementRect(SubElement element,
const QStyleOption *option,
const QWidget *widget)
const
1681 case SE_PushButtonContents:
1682 return option->rect.adjusted(pushButtonHorizontalMargin, 0, -pushButtonHorizontalMargin, 0);
1683 case SE_ItemViewItemFocusRect:
1684 return option->rect.adjusted(focusFrameWidth, focusFrameWidth, -focusFrameWidth, -focusFrameWidth);
1685 case SE_ProgressBarGroove:
1686 case SE_ProgressBarContents:
1687 return option->rect;
1688 case SE_ProgressBarLabel:
1690 case SE_LineEditContents: {
1691 int horizontalMargin =
1692 widget !=
nullptr && qobjectIsInstanceOf<QAbstractSpinBox>(widget->parent())
1693 ? spinBoxEditHorizontalMargin
1694 : lineEditHorizontalMargin;
1695 return option->rect.adjusted(
1696 horizontalMargin, lineEditVerticalMargin, -horizontalMargin, -lineEditVerticalMargin);
1698 case SE_CheckBoxFocusRect:
1699 case SE_RadioButtonFocusRect:
1701 checkBoxOrRadioButtonFocusStrokeWidth, (option->rect.height() - checkBoxOrRadioButtonHoverSize) * 0.5,
1702 checkBoxOrRadioButtonHoverSize, checkBoxOrRadioButtonHoverSize);
1703 case SE_CheckBoxClickRect:
1704 return subElementRect(SE_CheckBoxIndicator, option, widget)
1705 | subElementRect(SE_CheckBoxContents, option, widget);
1706 case SE_RadioButtonClickRect:
1707 return subElementRect(SE_RadioButtonIndicator, option, widget)
1708 | subElementRect(SE_RadioButtonContents, option, widget);
1710 return QCommonStyle::subElementRect(element, option, widget);;
1714QSize QOhosStyle::sizeFromContents(
1715 ContentsType contents,
const QStyleOption *option,
const QSize &contentsSize,
const QWidget *widget)
const
1718 case CT_ItemViewItem: {
1719 const auto viewItemStyleOption = qstyleoption_cast<
const QStyleOptionViewItem *>(option);
1720 if (viewItemStyleOption !=
nullptr) {
1721 if (isItemViewSeparator(viewItemStyleOption->index)) {
1722 return QSize(option->rect.width(), itemViewSeparatorHeight);
1724 auto verticalMargin = viewItemStyleOption->features.testFlag(QStyleOptionViewItem::HasDecoration)
1725 ? itemViewItemWithDecorationVerticalMargin
1726 : itemViewItemVerticalMargin;
1727 return QCommonStyle::sizeFromContents(contents, option, contentsSize, widget)
1728 + QSize(0, 2 * verticalMargin);
1731 return QCommonStyle::sizeFromContents(contents, option, contentsSize, widget);
1734 case CT_PushButton: {
1735 auto sizeAlignment = (2 * pushButtonFocusFrameGap) + (2 * pushButtonFocusFrameWidth);
1736 return contentsSize + QSize(
1737 (pushButtonHorizontalMargin * 2) + sizeAlignment, (pushButtonVerticalMargin * 2) + sizeAlignment);
1740 const auto arrowSize = pixelMetric(PM_MenuButtonIndicator, option, widget);
1741 auto comboBoxSize = qStyleOptionIs<QStyleOptionComboBox>(option)
1742 && qstyleoption_cast<
const QStyleOptionComboBox *>(option)->editable
1743 ? contentsSize + QSize(2 * lineEditHorizontalMargin, 0)
1745 const auto frameWidthCompensation = 2 * comboBoxFocusFrameWidth;
1746 comboBoxSize.rwidth() += (arrowSize + frameWidthCompensation + 2 * comboBoxFrameLeftRightPadding);
1747 comboBoxSize.rheight() += (frameWidthCompensation + 2 * comboBoxVerticalMargin + 2 * lineEditVerticalMargin);
1748 return comboBoxSize;
1750 case CT_ProgressBar: {
1751 const auto progressBarStyleOption = qstyleoption_cast<
const QStyleOptionProgressBar *>(option);
1752 if (progressBarStyleOption !=
nullptr) {
1753 const bool horizontal = progressBarStyleOption->state & QStyle::State_Horizontal;
1755 return QSize(contentsSize.width(), std::max(contentsSize.height(), progressBarMinHeight));
1757 return QSize(std::max(contentsSize.height(), progressBarMinHeight), contentsSize.height());
1759 return QCommonStyle::sizeFromContents(contents, option, contentsSize, widget);
1763 const auto defaultSize = QCommonStyle::sizeFromContents(contents, option, contentsSize, widget);
1764 const auto *menuItemStyleOption = qstyleoption_cast<
const QStyleOptionMenuItem *>(option);
1765 if (menuItemStyleOption !=
nullptr) {
1766 if (menuItemStyleOption->menuItemType == QStyleOptionMenuItem::Separator) {
1767 return QSize(defaultSize.width(), itemViewSeparatorHeight);
1769 const auto menuVMargin = pixelMetric(PM_MenuVMargin, option, widget);
1770 const auto arrowWidth = menuItemStyleOption->menuItemType == QStyleOptionMenuItem::SubMenu
1771 ? menuVMargin + pixelMetric(PM_SmallIconSize, option, widget)
1773 const auto checkboxWidth = menuItemStyleOption->checkType != QStyleOptionMenuItem::NotCheckable
1774 ? menuVMargin + pixelMetric(PM_IndicatorWidth, option, widget)
1778 + QSize(2 * itemViewItemHorizontalMargin, 2 * menuVMargin)
1779 + QSize(arrowWidth, 0)
1780 + QSize(checkboxWidth, 0);
1787 int horizontalMargin;
1788 if (widget !=
nullptr && qobjectIsInstanceOf<QAbstractSpinBox>(widget->parent()))
1789 horizontalMargin = spinBoxEditHorizontalMargin;
1791 horizontalMargin = lineEditHorizontalMargin;
1792 return contentsSize + QSize(horizontalMargin * 2, lineEditVerticalMargin * 2);
1795 const auto spinBox = qstyleoption_cast<
const QStyleOptionSpinBox *>(option);
1796 if (spinBox !=
nullptr) {
1798 if (spinBox->subControls.testFlag(QStyle::SC_SpinBoxUp)
1799 && spinBox->subControls.testFlag(QStyle::SC_SpinBoxDown)) {
1800 buttonWidth = subControlRect(CC_SpinBox, spinBox, SC_SpinBoxDown, widget).width();
1804 const int frameWidth
1805 = spinBox->frame ? pixelMetric(PM_SpinBoxFrameWidth, option, widget) : 0;
1807 return QSize(contentsSize.width() + buttonWidth + 2 * frameWidth + spinBoxEditHorizontalMargin * 2,
1808 std::max(contentsSize.height() + 2 * frameWidth, spinBoxFrameHeight));
1811 return contentsSize;
1814 return QCommonStyle::sizeFromContents(contents, option, contentsSize, widget);
1818int QOhosStyle::pixelMetric(PixelMetric metric,
const QStyleOption *option,
const QWidget *widget)
const
1821 case PM_ButtonMargin:
1822 case PM_ButtonDefaultIndicator:
1823 case PM_ButtonShiftHorizontal:
1824 case PM_ButtonShiftVertical:
1826 case PM_IndicatorWidth:
1827 case PM_ExclusiveIndicatorWidth:
1828 return checkBoxOrRadioButtonSize;
1829 case PM_IndicatorHeight:
1830 case PM_ExclusiveIndicatorHeight:
1831 return checkBoxOrRadioButtonSize;
1832 case PM_FocusFrameHMargin:
1833 return qStyleOptionIs<QStyleOptionViewItem>(option)
1834 ? itemViewItemSpacing
1835 : QCommonStyle::pixelMetric(metric, option, widget);
1836 case PM_TextCursorWidth:
1837 return textCursorWidth;
1838 case PM_DefaultFrameWidth:
1839 if (qobjectIsInstanceOf<QLineEdit>(widget) || qobjectIsInstanceOf<QPushButton>(widget))
1842 return QCommonStyle::pixelMetric(metric, option, widget);
1843 case PM_MenuBarPanelWidth:
1845 case PM_MenuBarItemSpacing:
1846 return menuBarItemSpacing;
1847 case PM_MenuBarVMargin:
1848 return menuBarVerticalMargin;
1849 case PM_MenuBarHMargin:
1850 return menuBarHorizontalMargin;
1851 case PM_MenuPanelWidth:
1853 case PM_MenuHMargin:
1855 case PM_MenuVMargin:
1856 return menuItemVerticalMargin;
1857 case PM_ProgressBarChunkWidth:
1859 case PM_SliderThickness:
1860 return sliderThickness;
1861 case PM_SliderLength:
1862 case PM_SliderControlThickness:
1863 return sliderThumbSize + 2 * sliderHoverSize;
1864 case PM_SmallIconSize:
1865 return qStyleOptionIs<QStyleOptionMenuItem>(option) || qStyleOptionIs<QStyleOptionComboBox>(option)
1867 : QCommonStyle::pixelMetric(metric, option, widget);
1868 case PM_SplitterWidth:
1869 return splitterWidth;
1870 case PM_SpinBoxFrameWidth:
1871 return spinBoxFrameStroke;
1872 case PM_ScrollBarExtent:
1873 return maxScrollBarSize;
1874 case PM_TabBarTabShiftVertical:
1875 case PM_TabBarBaseOverlap:
1877 case PM_TabBarTabHSpace:
1878 return 2 * tabBarTabRadius + 2 * tabBarTabFrameWidth;
1879 case PM_TitleBarHeight:
1880 return titleBarHeight;
1881 case PM_HeaderMargin:
1882 return headerMargin;
1883 case PM_HeaderDefaultSectionSizeVertical:
1884 return headerDefaultSectionSizeVertical;
1885 case PM_ToolTipLabelFrameWidth:
1886 return toolTipFrameWidth;
1887 case PM_MenuButtonIndicator:
1888 return 2 * QCommonStyle::pixelMetric(metric, option, widget);
1890 return QCommonStyle::pixelMetric(metric, option, widget);
1894int QOhosStyle::styleHint(
1895 StyleHint hint,
const QStyleOption *option,
const QWidget *widget, QStyleHintReturn *hintReturn)
const
1898 case SH_Slider_AbsoluteSetButtons:
1899 return Qt::LeftButton | Qt::MiddleButton;
1900 case SH_Slider_PageSetButtons:
1902 case SH_ItemView_ShowDecorationSelected:
1903 return qobjectIsInstanceOf<QTreeView>(widget) ? 0 : 1;
1904 case SH_ToolTipLabel_Opacity:
1905 return toolTipBackgroundAlpha;
1906 case SH_Menu_MouseTracking:
1907 case SH_MenuBar_MouseTracking:
1910 return QCommonStyle::styleHint(hint, option, widget, hintReturn);
1914void QOhosStyle::polish(QWidget *widget)
1916 QCommonStyle::polish(widget);
1918 if (isHoverable(widget))
1919 widget->setAttribute(Qt::WA_Hover);
1921 if (qobjectIsInstanceOf<QPushButton>(widget)) {
1922 if (qobject_cast<QPushButton *>(widget)->isDefault()) {
1923 QPalette palette = widget->palette();
1924 auto textDisabledColor = palette.color(QPalette::Active, QPalette::Base);
1925 textDisabledColor.setAlphaF(ohos_id_alpha_disabled);
1926 palette.setColor(QPalette::All, QPalette::ButtonText, palette.color(QPalette::Active, QPalette::Base));
1927 palette.setColor(QPalette::Disabled, QPalette::ButtonText, textDisabledColor);
1928 widget->setPalette(palette);
1930 }
else if (qobjectIsInstanceOf<QScrollBar>(widget)) {
1931 widget->setAttribute(Qt::WA_NoSystemBackground);
1932 widget->setAttribute(Qt::WA_OpaquePaintEvent,
false);
1933 }
else if (qobjectIsInstanceOf<QGroupBox>(widget)) {
1935 font.setPointSize(groupBoxTitleTextFontSize);
1937 widget->setFont(font);
1939 auto groupBox = qobject_cast<QGroupBox *>(widget);
1940 groupBox->setAlignment(Qt::AlignHCenter);
1941 }
else if (qobjectIsInstanceOf<QListView>(widget)) {
1942 qobject_cast<QListView *>(widget)->viewport()->setAttribute(Qt::WA_Hover);
1943 }
else if (qobjectIsInstanceOf<QComboBox>(widget)) {
1944 auto comboBox = qobject_cast<QComboBox *>(widget);
1945 comboBox->setItemDelegate(
new QStyledItemDelegate(comboBox->view()));
1946 }
else if (qobjectIsInstanceOf<QMdiSubWindow>(widget)) {
1947 widget->setAttribute(Qt::WA_TranslucentBackground);
1948 widget->setAutoFillBackground(
false);
1950 auto palette = widget->palette();
1951 palette.setColor(QPalette::Highlight, palette.color(QPalette::Active, QPalette::Base));
1952 palette.setColor(QPalette::Inactive, QPalette::Dark, palette.color(QPalette::Inactive, QPalette::Base));
1954 QPalette::Inactive, QPalette::Window,
1955 makeInactiveOrDisabledFromColor(palette.color(QPalette::Active, QPalette::AlternateBase)));
1956 palette.setColor(QPalette::HighlightedText, Qt::black);
1957 widget->setPalette(palette);
1961void QOhosStyle::unpolish(QWidget *widget)
1963 if (isHoverable(widget)) {
1964 widget->setAttribute(Qt::WA_Hover,
false);
1965 }
else if (qobjectIsInstanceOf<QScrollBar>(widget)) {
1966 widget->setAttribute(Qt::WA_NoSystemBackground,
false);
1967 widget->setAttribute(Qt::WA_OpaquePaintEvent);
1968 }
else if (qobjectIsInstanceOf<QListView>(widget)) {
1969 qobject_cast<QListView *>(widget)->viewport()->setAttribute(Qt::WA_Hover,
false);
1971 QCommonStyle::unpolish(widget);
1974QPalette QOhosStyle::standardPalette()
const
1976 return *QGuiApplicationPrivate::platformTheme()->palette();