diff --git a/src/widgets/itemviews/qheaderview.cpp b/src/widgets/itemviews/qheaderview.cpp index 3b4f8911e07..d171dedc42f 100644 --- a/src/widgets/itemviews/qheaderview.cpp +++ b/src/widgets/itemviews/qheaderview.cpp @@ -1357,6 +1357,18 @@ int QHeaderView::stretchSectionCount() const return d->stretchSections; } +bool QHeaderView::setMenu(int logicalIndex, QMenu *menu) +{ + Q_D(QHeaderView); + return d->setMenu(logicalIndex, menu); +} + +QMenu *QHeaderView::menu(int logicalIndex) +{ + Q_D(QHeaderView); + return d->menu(logicalIndex); +} + /*! \property QHeaderView::showSortIndicator \brief whether the sort indicator is shown @@ -2643,7 +2655,13 @@ void QHeaderView::mousePressEvent(QMouseEvent *e) int handle = d->sectionHandleAt(pos); d->originalSize = -1; // clear the stored original size if (handle == -1) { - d->firstPressed = d->pressed = logicalIndexAt(pos); + int logical = d->firstPressed = d->pressed = logicalIndexAt(pos); + auto m = menu(logical); + if (m) { + int end = sectionViewportPosition(logical) + sectionSize(logical) - 1; + if (pos > end - 20) + m->popup(e->globalPosition().toPoint()); + } if (d->clickableSections) emit sectionPressed(d->pressed); diff --git a/src/widgets/itemviews/qheaderview.h b/src/widgets/itemviews/qheaderview.h index 07475257433..7e2714944a8 100644 --- a/src/widgets/itemviews/qheaderview.h +++ b/src/widgets/itemviews/qheaderview.h @@ -105,6 +105,9 @@ public: int stretchSectionCount() const; + bool setMenu(int logicalIndex, QMenu *menu); + QMenu *menu(int logicalIndex); + void setSortIndicatorShown(bool show); bool isSortIndicatorShown() const; diff --git a/src/widgets/itemviews/qheaderview_p.h b/src/widgets/itemviews/qheaderview_p.h index d3bc90e7d21..9b90d2df8ba 100644 --- a/src/widgets/itemviews/qheaderview_p.h +++ b/src/widgets/itemviews/qheaderview_p.h @@ -24,6 +24,7 @@ #if QT_CONFIG(label) #include "QtWidgets/qlabel.h" #endif +#include #include @@ -258,6 +259,20 @@ public: mutable QSize cachedSizeHint; mutable QBasicTimer delayedResize; + QMenu *menu(int logicalIndex) + { + auto it = menus.constFind(logicalIndex); + return it == menus.end() ? nullptr : *it; + } + bool setMenu(int logicalIndex, QMenu *menu) + { + if (logicalIndex < 0 || logicalIndex >= sectionCount()) + return false; + menus[logicalIndex] = menu; + return true; + } + QHash > menus; + int firstCascadingSection; int lastCascadingSection;