15#include <QApplication>
18#include <QLinearGradient>
20#include <QResizeEvent>
22#include <QStyleOptionMenuItem>
37#define HELP_DRAW_RECT(p, rect) \
40 QPen _pen(Qt::DashDotDotLine); \
41 _pen.setColor(QColor(219, 26, 59)); \
43 p.setBrush(QBrush()); \
49RibbonStackedWidget::RibbonStackedWidget(QWidget *parent)
50 : QStackedWidget(parent)
66 if (m_isPopup == popup) {
71 setWindowFlags(Qt::Popup);
73 setWindowFlags(Qt::Widget);
80 switch (
event->type()) {
91 return QStackedWidget::event(
event);
102 QWidget *w = widget(from);
115 m_quickAccessBar->layout()->setSizeConstraint(QLayout::SetDefaultConstraint);
116 m_quickAccessBar->setObjectName(QStringLiteral(
"qx_QuickAccessBar"));
127 return m_quickAccessBar;
134 , m_iconRightBorderPosition(1)
141 , m_quickAccessBarPosition(
RibbonBar::QABRightPosition)
142 , m_tabBarPosition(
RibbonBar::TBLeftPosition)
144 , m_lastShowStyle(
RibbonBar::OfficeStyle)
145 , m_pageContextColorListIndex(-1)
146 , m_titleAligment(Qt::AlignCenter)
148 , m_titleVisible(true)
149 , m_pageContextCoverTab(false)
150 , m_layoutRequest(false)
151 , m_blockResize(false)
154 << QColor(242, 203, 29)
155 << QColor(255, 157, 0)
156 << QColor(14, 81, 167)
157 << QColor(228, 0, 69)
158 << QColor(67, 148, 0)
169 m_tabBar->setObjectName(QStringLiteral(
"qx_RibbonTabBar"));
182 m_tabBar->setObjectName(QStringLiteral(
"qx_RibbonStackedWidget"));
184 m_stack->installEventFilter(q);
199 if (btn->parent() != q) {
202 btn->move(0, q->titleBarHeight());
205 if (btn->objectName().isEmpty()) {
206 btn->setObjectName(QStringLiteral(
"qx_RibbonApplicationButton"));
208 btn->setVisible(
true);
233 m_stack->setFocusPolicy(Qt::NoFocus);
238 q->setFixedHeight(
m_tabBar->geometry().bottom());
253 action->setIcon(q->style()->standardIcon(
m_minimized ? QStyle::SP_TitleBarUnshadeButton
254 : QStyle::SP_TitleBarShadeButton,
277 for (
int i = 0; i < tabcount; ++i) {
278 QVariant var =
m_tabBar->tabData(i);
282 m_tabBar->setTabData(i, QVariant::fromValue(data));
297 cd.tabPageIndex.clear();
298 for (
int i = 0; i < cd.pageContext->pageCount(); ++i) {
300 for (
int t = 0; t < c; ++t) {
304 if (data.
page == page) {
305 cd.tabPageIndex.append(t);
308 cd.tabPageIndex.append(-1);
319 QList<RibbonPage *> pages = q->pages();
320 for (
RibbonPage *page : std::as_const(pages)) {
351 QPoint pageContextPos(q->width(), -1);
352 QMargins border = q->contentsMargins();
353 for (
int i = 0; i < pageContextDataList.size(); ++i) {
354 QRect contextTitleRect;
355 QList<int> indexs = pageContextDataList[i].tabPageIndex;
356 QColor clr = pageContextDataList[i].pageContext->contextColor();
357 if (!indexs.isEmpty()) {
358 contextTitleRect =
m_tabBar->tabRect(indexs.first());
359 QRect endRect =
m_tabBar->tabRect(indexs.last());
360 contextTitleRect.setRight(endRect.right());
363 contextTitleRect.setHeight(
m_tabBar->height() - 1);
365 contextTitleRect.setTop(border.top());
367 if (tabBarRect.intersects(contextTitleRect)) {
368 QRect visibleRect = tabBarRect.intersected(contextTitleRect);
369 visibleRect.setTop(contextTitleRect.top());
370 paintPageContextTab(p, pageContextDataList[i].pageContext->contextTitle(), visibleRect, clr);
373 if (contextTitleRect.left() < pageContextPos.x()) {
374 pageContextPos.setX(contextTitleRect.left());
376 if (contextTitleRect.right() > pageContextPos.y()) {
377 pageContextPos.setY(contextTitleRect.right());
380#ifdef QX_DRAW_CONTEXT_PAGE_BORDER
386 p.setBrush(Qt::NoBrush);
387 p.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
388 p.drawRect(
m_stack->geometry());
395 QWidget *parWindow = q->parentWidget();
398 int x = border.right();
405 if (pageContextPos.y() < 0) {
414 titleRegion.setRect(x, border.top(), w, q->titleBarHeight());
418 int rightwidth = q->width() - pageContextPos.y();
425 if (rightwidth > leftwidth) {
426 titleRegion.setRect(pageContextPos.y(), border.top(), rightwidth, q->titleBarHeight());
431#ifdef QX_RIBBON_DEBUG_HELP_DRAW
433 p.setBrush(QColor(255, 0, 0, 120));
434 p.drawRect(titleRegion);
450 QMargins border = q->contentsMargins();
451 for (
int i = 0; i < pageContextDataList.size(); ++i) {
452 QRect contextTitleRect;
453 QList<int> indexs = pageContextDataList[i].tabPageIndex;
454 QColor clr = pageContextDataList[i].pageContext->contextColor();
455 if (!indexs.isEmpty()) {
456 contextTitleRect =
m_tabBar->tabRect(indexs.first());
457 QRect endRect =
m_tabBar->tabRect(indexs.last());
458 contextTitleRect.setRight(endRect.right());
460 contextTitleRect.setHeight(
m_tabBar->height() - 1);
462 contextTitleRect.setTop(border.top());
464 if (tabBarRect.intersects(contextTitleRect)) {
465 QRect visibleRect = tabBarRect.intersected(contextTitleRect);
469#ifdef QX_DRAW_CONTEXT_PAGE_BORDER
475 p.setBrush(Qt::NoBrush);
476 p.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
477 p.drawRect(
m_stack->geometry());
484 QWidget *parWindow = q->parentWidget();
488 int width = q->width() - start;
504 QRect titleRegion(start, border.top(), width, q->titleBarHeight());
505#ifdef QX_RIBBON_DEBUG_HELP_DRAW
507 p.setBrush(QColor(255, 0, 0, 120));
508 p.drawRect(titleRegion);
523 pen.setStyle(Qt::SolidLine);
525 QMargins border = q->contentsMargins();
526 const int lineY =
m_tabBar->geometry().bottom();
527 painter.drawLine(QPoint(border.left(), lineY), QPoint(q->width() - border.right() - 1, lineY));
535 painter.setPen(q->palette().color(QPalette::WindowText));
545 QMargins border = q->contentsMargins();
547 painter.setPen(Qt::NoPen);
548 painter.setBrush(color);
549 painter.drawRect(QRect(contextRect.x(), border.top(), contextRect.width(), 5));
552 QColor gColor = color.lighter(190);
555 contextRect -= QMargins(0, 5, 0, 0);
558 contextRect.setBottom(
m_tabBar->geometry().top());
560 painter.fillRect(contextRect, gColor);
563 if (q->isOfficeStyle()) {
564 if (!title.isEmpty()) {
565 contextRect.setBottom(
m_tabBar->geometry().top());
566 painter.setPen(color);
567 painter.drawText(contextRect, Qt::AlignCenter, title);
575 painter.setPen(gColor);
576 painter.setBrush(Qt::NoBrush);
577 QRect tabRect(contextRect.bottomLeft(), QPoint(contextRect.bottomRight().x(),
m_tabBar->geometry().bottom()));
578 painter.drawLine(tabRect.topLeft(), tabRect.bottomLeft());
579 painter.drawLine(tabRect.topRight(), tabRect.bottomRight());
589 QMargins border = q->contentsMargins();
590 int x = border.left();
591 int y = border.top();
593 const int validTitleBarHeight = q->titleBarHeight();
594 const int tabH = q->tabBarHeight();
600 QWidget *cornerL = q->cornerWidget(Qt::TopLeftCorner);
601 if (cornerL && cornerL->isVisible()) {
602 QSize cornerSize = cornerL->sizeHint();
603 if (cornerSize.height() < validTitleBarHeight) {
604 int detal = (validTitleBarHeight - cornerSize.height()) / 2;
605 cornerL->setGeometry(x, y + detal, cornerSize.width(), cornerSize.height());
607 cornerL->setGeometry(x, y, cornerSize.width(), validTitleBarHeight);
609 x = cornerL->geometry().right() + 5;
613 m_quickAccessBar->setGeometry(x, y, quickAccessBarSize.width(), validTitleBarHeight);
614 x += quickAccessBarSize.width() + 5;
621 int endX = q->width() - border.right();
624 endX -= wSize.width();
629 endX -= wSize.width();
635 y += validTitleBarHeight;
641 endX = q->width() - border.right();
642 QWidget *cornerW = q->cornerWidget(Qt::TopRightCorner);
643 if (cornerW && cornerW->isVisible()) {
644 QSize cornerSize = cornerW->
sizeHint();
645 endX -= cornerSize.width();
646 if (cornerSize.height() < tabH) {
647 int detal = (tabH - cornerSize.height()) / 2;
648 cornerW->setGeometry(endX, y + detal, cornerSize.width(), cornerSize.height());
650 cornerW->setGeometry(endX, y, cornerSize.width(), otherH);
655 endX -= wSize.width();
660 endX -= wSize.width();
663 int allowedTabBarWidth = endX - x;
666 m_tabBar->setGeometry(x, y, qMin(minTabBarWidth, allowedTabBarWidth), tabH);
668 if (minTabBarWidth < allowedTabBarWidth) {
671 int xOffset = (allowedTabBarWidth - minTabBarWidth) / 2;
672 m_tabBar->setGeometry(x + xOffset, y, minTabBarWidth, tabH);
674 m_tabBar->setGeometry(x, y, allowedTabBarWidth, tabH);
686 QMargins border = q->contentsMargins();
687 int x = border.left();
688 int y = border.top();
690 const int validTitleBarHeight = q->titleBarHeight();
693 int endX = q->width() - border.right();
696 endX -= wSize.width();
699 QWidget *cornerR = q->cornerWidget(Qt::TopRightCorner);
700 if (cornerR && cornerR->isVisible()) {
701 QSize cornerSize = cornerR->sizeHint();
702 endX -= cornerSize.width();
703 if (cornerSize.height() < validTitleBarHeight) {
704 int detal = (validTitleBarHeight - cornerSize.height()) / 2;
705 cornerR->setGeometry(endX, y + detal, cornerSize.width(), cornerSize.height());
707 cornerR->setGeometry(endX, y, cornerSize.width(), validTitleBarHeight);
712 endX -= wSize.width();
717 endX -= wSize.width();
722 endX -= wSize.width();
728 endX -= quickAccessBarSize.width();
729 m_quickAccessBar->setGeometry(endX, y, quickAccessBarSize.width(), validTitleBarHeight);
732 QWidget *cornerL = q->cornerWidget(Qt::TopLeftCorner);
733 if (cornerL && cornerL->isVisible()) {
734 QSize cornerSize = cornerL->sizeHint();
735 endX -= cornerSize.width();
736 if (cornerSize.height() < validTitleBarHeight) {
737 int detal = (validTitleBarHeight - cornerSize.height()) / 2;
738 cornerL->setGeometry(endX, y + detal, cornerSize.width(), cornerSize.height());
740 cornerL->setGeometry(endX, y, cornerSize.width(), validTitleBarHeight);
745 int tabH = q->tabBarHeight();
746 if (tabH > validTitleBarHeight) {
748 tabH = validTitleBarHeight;
751 y += validTitleBarHeight - tabH;
760 m_quickAccessBar->setGeometry(x, border.top(), quickAccessBarSize.width(), validTitleBarHeight);
775 m_tabBar->setGeometry(x, y, qMin(minTabBarWidth, allowedTabBarWidth), tabH);
777 if (minTabBarWidth < allowedTabBarWidth) {
780 int xOffset = (allowedTabBarWidth - minTabBarWidth) / 2;
781 m_tabBar->setGeometry(x + xOffset, y, minTabBarWidth, tabH);
783 m_tabBar->setGeometry(x, y, allowedTabBarWidth, tabH);
793 QMargins border = q->contentsMargins();
795 QPoint absPosition = q->mapToGlobal(QPoint(border.left(),
m_tabBar->geometry().bottom() + 1));
796 m_stack->setGeometry(absPosition.x(), absPosition.y(), q->width() - border.left() - border.right(),
800 q->width() - border.left() - border.right(),
817 QMargins border = q->contentsMargins();
825 QWidget *cornerL = q->cornerWidget(Qt::TopLeftCorner);
826 if (cornerL && cornerL->isVisible()) {
827 w1 += cornerL->sizeHint().width() + 5;
848 QWidget *cornerW = q->cornerWidget(Qt::TopRightCorner);
849 if (cornerW && cornerW->isVisible()) {
850 w2 += cornerW->sizeHint().width();
860 return qMax(w1, w2) + border.left() + border.right();
866 QMargins border = q->contentsMargins();
874 QWidget *cornerR = q->cornerWidget(Qt::TopRightCorner);
875 if (cornerR && cornerR->isVisible()) {
876 w += cornerR->sizeHint().width();
892 QWidget *cornerL = q->cornerWidget(Qt::TopLeftCorner);
893 if (cornerL && cornerL->isVisible()) {
894 w += cornerL->sizeHint().width();
914 int mintabBarWidth = 0;
919 for (
int i = 0; i < cnt; ++i) {
920 mintabBarWidth +=
m_tabBar->tabRect(i).width();
922 mintabBarWidth += (mg.left() + mg.right());
923 return mintabBarWidth;
951 for (
int i = 0; i < size; ++i) {
955 if (innerValue.
page == page) {
967 buttonGroup->setObjectName(QStringLiteral(
"qx_RibbonButtonGroup"));
968 buttonGroup->setFrameShape(QFrame::NoFrame);
988 RibbonPage *w = qobject_cast<RibbonPage *>(sender());
995 QVariant var =
m_tabBar->tabData(i);
998 if (w == data.
page) {
1007 Q_ASSERT_X(page !=
Q_NULLPTR,
"onPageContextAdded",
"add Q_NULLPTR page");
1014 QVariant var =
m_tabBar->tabData(index);
1017 if (var.isValid()) {
1022 if (
m_stack->currentWidget() != page) {
1023 m_stack->setCurrentWidget(page);
1029#if QT_VERSION < QT_VERSION_CHECK(6, 3, 0)
1030 QHoverEvent ehl(QEvent::HoverLeave,
m_tabBar->mapToGlobal(QCursor::pos()),
1031 m_tabBar->mapToGlobal(QCursor::pos()));
1033 QHoverEvent ehl(QEvent::HoverLeave,
m_tabBar->mapToParent(QCursor::pos()),
1034 m_tabBar->mapToGlobal(QCursor::pos()),
m_tabBar->mapToGlobal(QCursor::pos()));
1036 QApplication::sendEvent(
m_tabBar, &ehl);
1045 Q_EMIT q->currentRibbonTabChanged(index);
1071#if QT_VERSION < QT_VERSION_CHECK(6, 3, 0)
1072 QHoverEvent ehl(QEvent::HoverLeave,
m_tabBar->mapToGlobal(QCursor::pos()),
1073 m_tabBar->mapToGlobal(QCursor::pos()));
1075 QHoverEvent ehl(QEvent::HoverLeave,
m_tabBar->mapToParent(QCursor::pos()),
1076 m_tabBar->mapToGlobal(QCursor::pos()),
m_tabBar->mapToGlobal(QCursor::pos()));
1078 QApplication::sendEvent(
m_tabBar, &ehl);
1136 return d->m_applicationButton;
1151 d->setApplicationButton(btn);
1152 QApplication::postEvent(
this,
new QResizeEvent(size(), size()));
1168 page->setObjectName(title);
1181 page->setRibbonBar(
this);
1183 int i = d->m_tabBar->insertTab(index,
page->windowTitle());
1187 d->m_tabBar->setTabData(i, QVariant::fromValue(tabdata));
1192 d->m_stack->insertWidget(i,
page);
1195 QApplication::postEvent(
this,
new QResizeEvent(size(), size()));
1211 QVariant var = d->m_tabBar->tabData(index);
1213 if (var.isValid()) {
1230 int c = d->m_stack->count();
1232 for (
int i = 0; i < c; ++i) {
1233 RibbonPage *w = qobject_cast<RibbonPage *>(d->m_stack->widget(i));
1234 if (w && w->windowTitle() == title) {
1250 int c = d->m_stack->count();
1252 for (
int i = 0; i < c; ++i) {
1253 RibbonPage *w = qobject_cast<RibbonPage *>(d->m_stack->widget(i));
1254 if (w && w->objectName() == objname) {
1269 int c = d->m_stack->count();
1270 QList<RibbonPage *> res;
1272 for (
int i = 0; i < c; ++i) {
1273 RibbonPage *w = qobject_cast<RibbonPage *>(d->m_stack->widget(i));
1294 return (tabindex >= 0);
1304 for (
auto i = d->m_hidedPage.begin(); i != d->m_hidedPage.end(); ++i) {
1305 if (i->page ==
page) {
1306 int index = d->m_tabBar->insertTab(i->index, i->page->windowTitle());
1308 d->m_tabBar->setTabData(index, QVariant::fromValue(*i));
1309 d->m_hidedPage.erase(i);
1324 int tabcount = d->m_tabBar->count();
1326 for (
int i = 0; i < tabcount; ++i) {
1327 QVariant var = d->m_tabBar->tabData(i);
1328 if (var.isValid()) {
1331 d->m_hidedPage.append(p);
1332 d->m_tabBar->removeTab(i);
1348 int index = d->m_stack->indexOf(
page);
1365 int index = d->tabIndex(
page);
1366 bool isupdate =
false;
1368 d->m_tabBar->removeTab(index);
1371 d->m_stack->removeWidget(
page);
1382 QApplication::postEvent(
this,
new QResizeEvent(size(), size()));
1396 d->m_tabBar->moveTab(from, to);
1405 return d->tabIndex(
page);
1427 context->setObjectName(title);
1429 context->
setContextColor(color.isValid() ? color : d->getPageContextColor());
1443 d->resizeInWpsLiteStyle();
1445 d->m_pageContextList.append(context);
1458 for (
int i = 0; i < context->
pageCount(); ++i) {
1464 int index = d->m_tabBar->addTab(
page->windowTitle());
1469 tabdata.
index = index;
1470 d->m_tabBar->setTabData(index, QVariant::fromValue(tabdata));
1473 QRect r = d->m_tabBar->geometry();
1474 r.setWidth(d->calcMinTabBarWidth());
1475 d->m_tabBar->setGeometry(r);
1478 d->m_currentShowingPageContextList.append(pageContextData);
1480 QApplication::postEvent(
this,
new QResizeEvent(size(), size()));
1486 bool needResize =
false;
1488 for (
int i = 0; i < d->m_currentShowingPageContextList.size(); ++i) {
1489 if (d->m_currentShowingPageContextList[i].pageContext == context) {
1490 const QList<int> &indexs = d->m_currentShowingPageContextList[i].tabPageIndex;
1491 for (
int j = indexs.size() - 1; j >= 0; --j) {
1492 d->m_tabBar->removeTab(indexs[j]);
1496 d->m_currentShowingPageContextList.removeAt(i);
1502 QApplication::postEvent(
this,
new QResizeEvent(size(), size()));
1509 return d->isPageContextVisible(context);
1527 return d->m_pageContextCoverTab;
1533 d->m_pageContextCoverTab = cover;
1539 return d->m_pageContextList;
1557 d->m_pageContextList.removeAll(context);
1559 QList<RibbonPage *> res = context->
pageList();
1562 page->deleteLater();
1564 context->deleteLater();
1565 QApplication::postEvent(
this,
new QResizeEvent(size(), size()));
1576 return d->m_minimized;
1582 d->setMinimizedFlag(flag);
1583 d->updateMinimumButtonIcon();
1592 return (
Q_NULLPTR != d->m_minimumPageButton);
1600 if (
Q_NULLPTR == d->m_minimumPageButton) {
1602 d->m_minimumPageButton->ensurePolished();
1603 QAction *action =
new QAction(d->m_minimumPageButton);
1604 connect(action, &QAction::triggered,
this, [=]() {
1607 d->m_minimumPageButton->setDefaultAction(action);
1608 d->m_bottomRightButtonGroup->addWidget(d->m_minimumPageButton);
1611 d->updateMinimumButtonIcon();
1613 if (
Q_NULLPTR != d->m_minimumPageButton) {
1614 d->m_minimumPageButton->hide();
1615 d->m_minimumPageButton->deleteLater();
1639 case Qt::TopLeftCorner:
1640 if (
Q_NULLPTR == d->m_topLeftButtonGroup) {
1641 d->m_topLeftButtonGroup = d->createButtonGroup();
1643 buttonGroup = d->m_topLeftButtonGroup;
1645 case Qt::TopRightCorner:
1646 if (
Q_NULLPTR == d->m_topRightButtonGroup) {
1647 d->m_topRightButtonGroup = d->createButtonGroup();
1649 buttonGroup = d->m_topRightButtonGroup;
1651 case Qt::BottomLeftCorner:
1652 if (
Q_NULLPTR == d->m_bottomLeftButtonGroup) {
1653 d->m_bottomLeftButtonGroup = d->createButtonGroup();
1655 buttonGroup = d->m_bottomLeftButtonGroup;
1657 case Qt::BottomRightCorner:
1658 if (
Q_NULLPTR == d->m_bottomRightButtonGroup) {
1659 d->m_bottomRightButtonGroup = d->createButtonGroup();
1661 buttonGroup = d->m_bottomRightButtonGroup;
1667 buttonGroup->show();
1675 return d->m_quickAccessBar->quickAccessBar();
1681 if (d->m_quickAccessBarPosition == position) {
1684 d->m_quickAccessBarPosition = position;
1685 if (!d->isOfficeStyle()) {
1693 return d->m_quickAccessBarPosition;
1699 if (d->m_tabBarPosition == position) {
1702 d->m_tabBarPosition = position;
1709 return d->m_tabBarPosition;
1715 return d->m_ribbonStyle;
1727 d->m_ribbonStyle = v;
1728 d->m_lastShowStyle = v;
1729 d->m_quickAccessBar->setIconVisible(
isOfficeStyle() && d->m_titleVisible);
1730 d->updateRibbonElementGeometry();
1750 d->m_blockResize =
true;
1751 setFixedHeight(d->m_tabBar->geometry().bottom());
1752 d->m_blockResize =
false;
1760 return d->m_tabBar->currentIndex();
1766 d->m_tabBar->setCurrentIndex(index);
1772 return d->isOfficeStyle();
1778 return d->isTwoRowStyle();
1784 d->m_windowButtonGroup = widget;
1795 d->updateRibbonBarHeight();
1805 d->updateMinimumButtonIcon();
1813 QApplication::postEvent(
this,
new QResizeEvent(size(), size()));
1819 return d->m_titleAligment;
1825 d->m_titleAligment = al;
1831 d->m_titleVisible = visible;
1832 d->m_quickAccessBar->setIconVisible(
isOfficeStyle() && visible);
1838 QSize sz = QMenuBar::sizeHint();
1841 w = d->minimumWidthInOfficeStyle();
1843 w = d->minimumWidthInWpsLiteStyle();
1857 bool res = QMenuBar::event(
event);
1859 switch (
event->type()) {
1862 case QEvent::ApplicationFontChange: {
1865 case QEvent::LayoutRequest: {
1869 if (d->m_layoutRequest) {
1871 d->m_layoutRequest =
false;
1886 if ((obj == cornerWidget(Qt::TopLeftCorner)) || (obj == cornerWidget(Qt::TopRightCorner))) {
1888 if ((QEvent::ShowToParent == e->type()) || (QEvent::MouseButtonRelease == e->type())) {
1889 d->m_layoutRequest =
true;
1891 }
else if (obj == d->m_stack && d->m_stack->isPopup()) {
1894 if ((QEvent::MouseButtonPress == e->type()) || (QEvent::MouseButtonDblClick == e->type())) {
1895 QMouseEvent *mouseEvent =
static_cast<QMouseEvent *
>(e);
1896#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
1897 QPoint pos = mouseEvent->pos();
1900 QPoint pos = mouseEvent->position().toPoint();
1901 QPoint globalPos = mouseEvent->globalPosition().toPoint();
1903 if (!d->m_stack->rect().contains(pos)) {
1904 QWidget *clickedWidget = QApplication::widgetAt(globalPos);
1905 if (clickedWidget == d->m_tabBar) {
1906 const QPoint targetPoint = clickedWidget->mapFromGlobal(globalPos);
1907 QMouseEvent *evPress =
1908 new QMouseEvent(mouseEvent->type(), targetPoint, globalPos, mouseEvent->button(),
1909 mouseEvent->buttons(), mouseEvent->modifiers());
1910 QApplication::postEvent(clickedWidget, evPress);
1917 return QMenuBar::eventFilter(obj, e);
1926 d->paintInOfficeStyle(p);
1928 d->paintInWpsLiteStyle(p);
1930#ifdef QX_RIBBON_DEBUG_HELP_DRAW
1941 if (d->m_blockResize) {
QList< int > tabPageIndex
RibbonPageContext * pageContext
void updateRibbonBarHeight()
void resizeInOfficeStyle()
Qt::Alignment m_titleAligment
bool isTwoRowStyle() const
void onPageWindowTitleChanged(const QString &title)
QWidget * m_tabBarBaseLine
RibbonBar::TabBarPosition m_tabBarPosition
void onStackWidgetHided()
void onCurrentRibbonTabClicked(int index)
ribbon tab bar单击
void onCurrentRibbonTabChanged(int index)
void updateMinimumButtonIcon()
RibbonQuickAccessBarContainer * m_quickAccessBar
void paintBackground(QPainter &painter)
QList< PageContextManagerData > m_currentShowingPageContextList
RibbonButtonGroup * m_bottomLeftButtonGroup
RibbonControlButton * m_minimumPageButton
隐藏面板按钮
bool isOfficeStyle() const
QColor getPageContextColor()
void onTabMoved(int from, int to)
int calcMinTabBarWidth() const
根据情况重置tabbar的宽度,主要针对wps模式
void paintWindowTitle(QPainter &painter, const QString &title, const QRect &titleRegion)
bool isPageContextVisible(RibbonPageContext *pageContext)
bool m_pageContextCoverTab
void paintInOfficeStyle(QPainter &p)
void setMinimizedFlag(bool flag)
RibbonButtonGroup * m_topLeftButtonGroup
void paintInWpsLiteStyle(QPainter &p)
RibbonBar::RibbonStyle m_ribbonStyle
RibbonStackedWidget * m_stack
void setApplicationButton(QAbstractButton *btn)
int m_pageContextColorListIndex
int mainBarHeight() const
mainBarHeight 的计算高度
void resizeStackedWidget()
RibbonButtonGroup * createButtonGroup()
void onWindowTitleChanged(const QString &title)
int minimumWidthInWpsLiteStyle() const
RibbonBar::QuickAccessBarPosition m_quickAccessBarPosition
QWidget * m_windowButtonGroup
void updatePageContextManagerData()
刷新所有ContextPageManagerData,这个在单独一个Page删除时调用
RibbonButtonGroup * m_bottomRightButtonGroup
在 tabbar 右边的按钮群
void updateRibbonElementGeometry()
void onPageContextAdded(RibbonPage *page)
int m_iconRightBorderPosition
标题栏x值的最小值,在有图标和快捷启动按钮,此值都需要变化
void onWindowIconChanged(const QIcon &icon)
void resizeInWpsLiteStyle()
void onCurrentRibbonTabDoubleClicked(int index)
QList< QColor > m_pageContextColorList
QAbstractButton * m_applicationButton
int tabIndex(RibbonPage *page) const
根据RibbonPage*指针查找tabbar的index
void paintPageContextTab(QPainter &painter, const QString &title, QRect contextRect, const QColor &color)
RibbonButtonGroup * m_topRightButtonGroup
int minimumWidthInOfficeStyle() const
RibbonBar 继承 QMenuBar, 在 RibbonWindow 中直接替换了原来的 QMenuBar
void setPageContextVisible(RibbonPageContext *context, bool visible)
int titleBarHeight() const
RibbonPage * page(int index) const
通过索引找到page,如果超过索引范围,会返回Q_NULLPTR
void setWindowButtonGroup(QWidget *widget)
RibbonPage * insertPage(int index, const QString &title)
void minimizationChanged(bool minimized)
void setWindowTitleVisible(bool visible)
RibbonStyle currentRibbonStyle() const
void movePage(int from, int to)
void showMinimumButton(bool isShow=true)
void paintEvent(QPaintEvent *e) override
int pageIndex(RibbonPage *page) const
QList< RibbonPageContext * > pageContextList() const
void setTabBarPosition(TabBarPosition position)
void setWindowTitleAligment(Qt::Alignment al)
void setApplicationButton(QAbstractButton *btn)
设置applicationButton,如果想隐藏,可以传入Q_NULLPTR
RibbonPageContext * addPageContext(const QString &title, const QColor &color=QColor())
添加上下文标签
void setPageContextCoverTab(bool cover)
QList< RibbonPage * > pages(bool getAll=true) const
获取当前显示的所有的RibbonPage,包含未显示的RibbonPageContext的RibbonPage也一并返回
TabBarPosition tabBarPosition() const
bool haveShowMinimumButton() const
bool isOfficeStyle() const
bool eventFilter(QObject *obj, QEvent *e) override
void resizeEvent(QResizeEvent *e) override
QSize minimumSizeHint() const override
QAbstractButton * applicationButton()
bool isPageVisible(RibbonPage *page) const
判断这个page是否在显示状态,也就是tabbar有这个page
RibbonPage * pageByName(const QString &title) const
通过名字查找Page
void showPage(RibbonPage *page)
显示被隐藏的page
Qt::Alignment windowTitleAligment() const
QSize sizeHint() const override
RibbonButtonGroup * cornerButtonGroup(Qt::Corner corner=Qt::BottomRightCorner)
void removePage(RibbonPage *page)
移除RibbonPage
void applicationButtonClicked()
bool isPageContextVisible(RibbonPageContext *context)
void raisePage(RibbonPage *page)
确保标签显示出来,tab并切换到对应页
RibbonBar(QWidget *parent=Q_NULLPTR)
void setMinimized(bool flag)
RibbonPage * pageByObjectName(const QString &objname) const
通过ObjectName查找Page
void destroyPageContext(RibbonPageContext *context)
销毁上下文标签,上下文标签的RibbonPage也会随之销毁
void setQuickAccessBarPosition(QuickAccessBarPosition position)
void updateRibbonGeometry()
更新ribbon的布局数据,此函数适用于一些关键性尺寸变化,换起ribbon下面元素的布局
void setCurrentIndex(int index)
void showPageContext(RibbonPageContext *context)
void setRibbonStyle(RibbonStyle v)
设置ribbonbar的风格,此函数会重新设置所有元素,包括button的布局方式, 尤其是从三行变到两行的过程,重设的内容较多
void hidePage(RibbonPage *page)
隐藏page,并不会删除或者取走,只是隐藏
void ribbonStyleChanged(RibbonStyle nowStyle)
RibbonPage * addPage(const QString &title)
RibbonQuickAccessBar * quickAccessBar() const
bool event(QEvent *event) override
QuickAccessBarPosition quickAccessBarPosition() const
bool isTwoRowStyle() const
bool isPageContextCoverTab()
void hidePageContext(RibbonPageContext *context)
void setIcon(const QIcon &i)
void setTitleVisible(bool b)
void setWidget(QWidget *w)
@ ThreeRowMode
三行布局模式,office就是三行布局模式,group能布置3行小toolbutton,默认模式
@ TwoRowMode
两行布局模式,wps的后续布局模式就是两行布局模式,group能布置2行小toolbutton
RibbonPage * page(int index)
QList< RibbonPage * > pageList() const
void pageAdded(RibbonPage *page)
void setContextColor(const QColor color)
void setContextTitle(const QString &title)
设置上下文标签的标题,标题仅在 office 模式下显示 RibbonBar::RibbonStyle
bool isPageContext() const
如果是ContextPage,此函数返回true
void updateItemGeometry()
刷新page的布局,适用于改变ribbon的模式之后调用
void setPageName(const QString &title)
void setGroupLayoutMode(RibbonGroup::GroupLayoutMode m)
~RibbonQuickAccessBarContainer()
RibbonQuickAccessBar * quickAccessBar() const
RibbonQuickAccessBarContainer(QWidget *parent=Q_NULLPTR)
void setCurrentIndex(int index)
const QMargins & tabMargin() const
QPoint globalMousePos(const QMouseEvent *event)
const int dragAreaMinimumWidth
const int tabBarBaseLineHeight
const int tabBarMinimumWidth
#define QX_INIT_PRIVATE(Class)
#define Q_NULLPTR
Copyleft (C) 2025 maminjie canpool@163.com SPDX-License-Identifier: MulanPSL-2.0
#define QX_FINI_PRIVATE()
#define QX_RIBBON_END_NAMESPACE
#define QX_RIBBON_BEGIN_NAMESPACE
#define HELP_DRAW_RECT(p, rect)
#define RibbonElementStyleOpt
#define RibbonElementFactory