summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShawn Rutledge <[email protected]>2024-12-12 09:31:48 +0100
committerShawn Rutledge <[email protected]>2025-02-13 12:41:16 +0100
commit6e089a66a4d08a5d788c194560fccdec793e6337 (patch)
tree23dbfb97d35f637d5bd5f5d9b3210b219a0e476b
parentd14e57ecbf98c0d7696a3c8ceb467739ddd5e083 (diff)
doc: Explain the use of QContextMenuEvent cross-platform
...and across Qt Quick and Widgets, and somewhat from a usability perspective. Pick-to: 6.9 Task-number: QTBUG-67331 Task-number: QTBUG-93486 Change-Id: I75085f3a7a8e76c3e67ff5864600324faf262a76 Reviewed-by: Mitch Curtis <[email protected]>
-rw-r--r--src/gui/kernel/qevent.cpp68
1 files changed, 61 insertions, 7 deletions
diff --git a/src/gui/kernel/qevent.cpp b/src/gui/kernel/qevent.cpp
index 5f4daced732..d0c2ddb2b3a 100644
--- a/src/gui/kernel/qevent.cpp
+++ b/src/gui/kernel/qevent.cpp
@@ -1907,14 +1907,65 @@ Q_IMPL_EVENT_COMMON(QIconDragEvent)
\ingroup events
- Context menu events are sent to widgets when a user performs
- an action associated with opening a context menu.
- The actions required to open context menus vary between platforms;
- for example, on Windows, pressing the menu button or clicking the
- right mouse button will cause this event to be sent.
+ A context menu event is sent when a user performs an action that should
+ open a contextual menu:
+ \list
+ \li clicking the right mouse button
+ \li pressing a dedicated keyboard menu key (if the keyboard has one,
+ such as the menu key on standard 104-key PC keyboards)
+ \li pressing some other keyboard shortcut (such as "Ctrl+Return" by
+ default on macOS 15 and newer)
+ \endlist
- When this event occurs it is customary to show a QMenu with a
- context menu, if this is relevant to the context.
+ The expected context menu should contain \l {QAction}{actions} that are
+ relevant to some content within the application (the "context"). In Qt, the
+ context is at least the particular \l {QWidget}{widget} or Qt Quick \l Item
+ that receives the QContextMenuEvent. If there is a selection, that should
+ probably be treated as the context. The context can be further refined
+ using \l QContextMenuEvent::pos() to pinpoint the content within the
+ widget, item or selection.
+
+ Widgets can override \l QWidget::contextMenuEvent() to handle this event.
+ Many widgets already do that, and have useful context menus by default.
+ Some widgets have a function such as
+ \l {QLineEdit::createStandardContextMenu()}{createStandardContextMenu()}
+ to populate the default set of actions into a \l QMenu, which can be
+ customized further in your subclass and then shown.
+
+ In Qt Quick, the event can be handled via the
+ \l {QtQuick.Controls::}{ContextMenu} attached property. Some
+ \l {QtQuick.Controls} Controls already provide context menus by default.
+
+ Unlike most synthetic events (such as a QMouseEvent that is sent only after
+ a QTouchEvent or QTabletEvent was not accepted), QContextMenuEvent is sent
+ regardless of whether the original mouse or key event was already handled
+ and \l {QEvent::isAccepted()}{accepted}. This is to accommodate the Windows
+ UI pattern of selecting some kind of items (icons, drawing elements, or
+ cells in an Item View) using the right mouse button (clicking or dragging),
+ and then getting a context menu as soon as you release the right mouse
+ button. (The actions on the menu are meant to apply to the selection.)
+ Therefore, on Windows the QContextMenuEvent is sent on mouse release; while
+ on other platforms, it's sent on press. Qt follows the
+ \l {QStyleHints::contextMenuTrigger()}{platform convention} by default.
+
+ There are also some Qt Quick Controls such as \l {QtQuick.Controls::}{Pane}
+ that accept mouse events, and nevertheless receive a QContextMenuEvent
+ after a mouse press or click.
+
+ If you prefer to support the press-drag-release UI pattern to open a
+ context menu on press, and drag over a menu item to select it on release,
+ you will need to do that by handling \l {QMouseEvent}{QMouseEvents} directly
+ (by overriding \l {QWidget::mousePressEvent()}{virtual functions} in
+ QWidget subclasses, or using \l TapHandler to open a \l Menu in Qt Quick);
+ and then the QContextMenuEvent will be redundant when the \l reason() is
+ \c Mouse. You should \l ignore() the event in that case; but you should
+ still ensure that the widget, custom control or application can respond to
+ a QContextMenuEvent that \l {reason()}{comes from} the platform-specific
+ keyboard shortcut.
+
+ When a QContextMenuEvent is \l {ignore()}{ignored}, Qt attempts to deliver
+ it to other widgets and/or Items under the \l {pos()}{position} (which
+ is usually translated from the cursor position).
*/
#ifndef QT_NO_CONTEXTMENU
@@ -1968,6 +2019,9 @@ QContextMenuEvent::QContextMenuEvent(Reason reason, const QPoint &pos)
Returns the position of the mouse pointer relative to the widget
that received the event.
+ \note If the QContextMenuEvent did not come from the right mouse button,
+ \c pos() may be \l {QPoint::isNull()}{null}.
+
\sa x(), y(), globalPos()
*/