aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMitch Curtis <mitch.curtis@qt.io>2024-12-17 16:18:05 +0800
committerMitch Curtis <mitch.curtis@qt.io>2025-02-28 08:48:48 +0800
commit3b598b6f7509f57e198e7de1f04e4333555e7227 (patch)
tree77d24ee4d3e06dbfd82730a1062f134643e80fb3 /src
parent121eec233e457f561c535d090ae7be47cd8e0c40 (diff)
ContextMenu: add to text editing controls
[ChangeLog][Controls] TextField and TextArea now provide a ContextMenu by default. If you already have a custom context menu for these types, ContextMenu will not open its own on e.g. right click. Fixes: QTBUG-35598 Pick-to: 6.9 Change-Id: I0897a7ba5e1b5b6d5425c80cbc6f2550c904605b Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/quickcontrols/basic/TextArea.qml5
-rw-r--r--src/quickcontrols/basic/TextField.qml5
-rw-r--r--src/quickcontrols/basic/impl/CMakeLists.txt2
-rw-r--r--src/quickcontrols/basic/impl/TextEditingContextMenu.qml31
-rw-r--r--src/quickcontrols/fluentwinui3/TextArea.qml4
-rw-r--r--src/quickcontrols/fluentwinui3/TextField.qml4
-rw-r--r--src/quickcontrols/fluentwinui3/impl/CMakeLists.txt6
-rw-r--r--src/quickcontrols/fluentwinui3/impl/CopyAction.qml9
-rw-r--r--src/quickcontrols/fluentwinui3/impl/CutAction.qml9
-rw-r--r--src/quickcontrols/fluentwinui3/impl/DeleteAction.qml9
-rw-r--r--src/quickcontrols/fluentwinui3/impl/PasteAction.qml9
-rw-r--r--src/quickcontrols/fluentwinui3/impl/SelectAllAction.qml9
-rw-r--r--src/quickcontrols/fluentwinui3/impl/TextEditingContextMenu.qml31
-rw-r--r--src/quickcontrols/fusion/TextArea.qml4
-rw-r--r--src/quickcontrols/fusion/TextField.qml4
-rw-r--r--src/quickcontrols/fusion/impl/CMakeLists.txt6
-rw-r--r--src/quickcontrols/fusion/impl/CopyAction.qml9
-rw-r--r--src/quickcontrols/fusion/impl/CutAction.qml9
-rw-r--r--src/quickcontrols/fusion/impl/DeleteAction.qml9
-rw-r--r--src/quickcontrols/fusion/impl/PasteAction.qml9
-rw-r--r--src/quickcontrols/fusion/impl/SelectAllAction.qml9
-rw-r--r--src/quickcontrols/fusion/impl/TextEditingContextMenu.qml31
-rw-r--r--src/quickcontrols/imagine/TextArea.qml4
-rw-r--r--src/quickcontrols/imagine/TextField.qml4
-rw-r--r--src/quickcontrols/imagine/impl/CMakeLists.txt1
-rw-r--r--src/quickcontrols/imagine/impl/TextEditingContextMenu.qml31
-rw-r--r--src/quickcontrols/ios/TextArea.qml4
-rw-r--r--src/quickcontrols/ios/TextField.qml4
-rw-r--r--src/quickcontrols/ios/impl/CMakeLists.txt6
-rw-r--r--src/quickcontrols/ios/impl/CopyAction.qml9
-rw-r--r--src/quickcontrols/ios/impl/CutAction.qml9
-rw-r--r--src/quickcontrols/ios/impl/DeleteAction.qml9
-rw-r--r--src/quickcontrols/ios/impl/PasteAction.qml9
-rw-r--r--src/quickcontrols/ios/impl/SelectAllAction.qml9
-rw-r--r--src/quickcontrols/ios/impl/TextEditingContextMenu.qml31
-rw-r--r--src/quickcontrols/macos/TextArea.qml6
-rw-r--r--src/quickcontrols/macos/TextField.qml5
-rw-r--r--src/quickcontrols/macos/impl/CMakeLists.txt6
-rw-r--r--src/quickcontrols/macos/impl/CopyAction.qml9
-rw-r--r--src/quickcontrols/macos/impl/CutAction.qml9
-rw-r--r--src/quickcontrols/macos/impl/DeleteAction.qml9
-rw-r--r--src/quickcontrols/macos/impl/PasteAction.qml9
-rw-r--r--src/quickcontrols/macos/impl/SelectAllAction.qml9
-rw-r--r--src/quickcontrols/macos/impl/TextEditingContextMenu.qml31
-rw-r--r--src/quickcontrols/material/TextArea.qml4
-rw-r--r--src/quickcontrols/material/TextField.qml4
-rw-r--r--src/quickcontrols/material/impl/CMakeLists.txt1
-rw-r--r--src/quickcontrols/material/impl/TextEditingContextMenu.qml31
-rw-r--r--src/quickcontrols/universal/TextArea.qml5
-rw-r--r--src/quickcontrols/universal/TextField.qml5
-rw-r--r--src/quickcontrols/universal/impl/CMakeLists.txt6
-rw-r--r--src/quickcontrols/universal/impl/CopyAction.qml9
-rw-r--r--src/quickcontrols/universal/impl/CutAction.qml9
-rw-r--r--src/quickcontrols/universal/impl/DeleteAction.qml9
-rw-r--r--src/quickcontrols/universal/impl/PasteAction.qml9
-rw-r--r--src/quickcontrols/universal/impl/SelectAllAction.qml9
-rw-r--r--src/quickcontrols/universal/impl/TextEditingContextMenu.qml31
-rw-r--r--src/quickcontrols/windows/TextArea.qml6
-rw-r--r--src/quickcontrols/windows/TextField.qml6
-rw-r--r--src/quickcontrols/windows/impl/CMakeLists.txt6
-rw-r--r--src/quickcontrols/windows/impl/CopyAction.qml9
-rw-r--r--src/quickcontrols/windows/impl/CutAction.qml9
-rw-r--r--src/quickcontrols/windows/impl/DeleteAction.qml9
-rw-r--r--src/quickcontrols/windows/impl/PasteAction.qml9
-rw-r--r--src/quickcontrols/windows/impl/SelectAllAction.qml9
-rw-r--r--src/quickcontrols/windows/impl/TextEditingContextMenu.qml31
-rw-r--r--src/quickcontrolsimpl/CMakeLists.txt6
-rw-r--r--src/quickcontrolsimpl/CopyAction.qml17
-rw-r--r--src/quickcontrolsimpl/CutAction.qml24
-rw-r--r--src/quickcontrolsimpl/DeleteAction.qml17
-rw-r--r--src/quickcontrolsimpl/PasteAction.qml17
-rw-r--r--src/quickcontrolsimpl/SelectAllAction.qml16
-rw-r--r--src/quicktemplates/qquickcontextmenu.cpp11
-rw-r--r--src/quicktemplates/qquickmenu.cpp6
-rw-r--r--src/quicktemplates/qquickmenu_p_p.h2
-rw-r--r--src/quicktemplates/qquickpopupwindow.cpp2
76 files changed, 789 insertions, 1 deletions
diff --git a/src/quickcontrols/basic/TextArea.qml b/src/quickcontrols/basic/TextArea.qml
index 0dc7c4558e..9a86c8ae66 100644
--- a/src/quickcontrols/basic/TextArea.qml
+++ b/src/quickcontrols/basic/TextArea.qml
@@ -3,6 +3,7 @@
import QtQuick
import QtQuick.Controls.impl
+import QtQuick.Controls.Basic.impl
import QtQuick.Templates as T
T.TextArea {
@@ -23,6 +24,10 @@ T.TextArea {
selectionColor: control.palette.highlight
selectedTextColor: control.palette.highlightedText
+ ContextMenu.menu: TextEditingContextMenu {
+ control: control
+ }
+
PlaceholderText {
id: placeholder
x: control.leftPadding
diff --git a/src/quickcontrols/basic/TextField.qml b/src/quickcontrols/basic/TextField.qml
index cf542a6886..67f9533694 100644
--- a/src/quickcontrols/basic/TextField.qml
+++ b/src/quickcontrols/basic/TextField.qml
@@ -3,6 +3,7 @@
import QtQuick
import QtQuick.Controls.impl
+import QtQuick.Controls.Basic.impl
import QtQuick.Templates as T
T.TextField {
@@ -23,6 +24,10 @@ T.TextField {
placeholderTextColor: control.palette.placeholderText
verticalAlignment: TextInput.AlignVCenter
+ ContextMenu.menu: TextEditingContextMenu {
+ control: control
+ }
+
PlaceholderText {
id: placeholder
x: control.leftPadding
diff --git a/src/quickcontrols/basic/impl/CMakeLists.txt b/src/quickcontrols/basic/impl/CMakeLists.txt
index 7f828c0350..f731e08502 100644
--- a/src/quickcontrols/basic/impl/CMakeLists.txt
+++ b/src/quickcontrols/basic/impl/CMakeLists.txt
@@ -16,6 +16,8 @@ qt_internal_add_qml_module(QuickControls2BasicStyleImpl
qquickbasicbusyindicator.cpp qquickbasicbusyindicator_p.h
qquickbasicdial.cpp qquickbasicdial_p.h
qquickbasicprogressbar.cpp qquickbasicprogressbar_p.h
+ QML_FILES
+ TextEditingContextMenu.qml
DEFINES
QT_NO_CAST_FROM_ASCII
QT_NO_CAST_TO_ASCII
diff --git a/src/quickcontrols/basic/impl/TextEditingContextMenu.qml b/src/quickcontrols/basic/impl/TextEditingContextMenu.qml
new file mode 100644
index 0000000000..81153c376d
--- /dev/null
+++ b/src/quickcontrols/basic/impl/TextEditingContextMenu.qml
@@ -0,0 +1,31 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+import QtQuick.Controls.Basic
+import QtQuick.Controls.impl
+
+Menu {
+ id: menu
+ popupType: Popup.Window
+
+ required property var control
+
+ CutAction {
+ control: menu.control
+ }
+ CopyAction {
+ control: menu.control
+ }
+ PasteAction {
+ control: menu.control
+ }
+ DeleteAction {
+ control: menu.control
+ }
+
+ MenuSeparator {}
+
+ SelectAllAction {
+ control: menu.control
+ }
+}
diff --git a/src/quickcontrols/fluentwinui3/TextArea.qml b/src/quickcontrols/fluentwinui3/TextArea.qml
index 9d94a3084b..0932cbeea0 100644
--- a/src/quickcontrols/fluentwinui3/TextArea.qml
+++ b/src/quickcontrols/fluentwinui3/TextArea.qml
@@ -38,6 +38,10 @@ T.TextArea {
].filter(Boolean).join("_") || "normal"
readonly property var config: Config.controls.textarea[__currentState] || {}
+ ContextMenu.menu: Impl.TextEditingContextMenu {
+ control: control
+ }
+
PlaceholderText {
id: placeholder
x: control.leftPadding
diff --git a/src/quickcontrols/fluentwinui3/TextField.qml b/src/quickcontrols/fluentwinui3/TextField.qml
index 37131167fd..c24328938a 100644
--- a/src/quickcontrols/fluentwinui3/TextField.qml
+++ b/src/quickcontrols/fluentwinui3/TextField.qml
@@ -38,6 +38,10 @@ T.TextField {
placeholderTextColor: control.palette.placeholderText
verticalAlignment: Text.AlignVCenter
+ ContextMenu.menu: Impl.TextEditingContextMenu {
+ control: control
+ }
+
PlaceholderText {
id: placeholder
x: control.leftPadding
diff --git a/src/quickcontrols/fluentwinui3/impl/CMakeLists.txt b/src/quickcontrols/fluentwinui3/impl/CMakeLists.txt
index 19536cc793..74c21d095c 100644
--- a/src/quickcontrols/fluentwinui3/impl/CMakeLists.txt
+++ b/src/quickcontrols/fluentwinui3/impl/CMakeLists.txt
@@ -7,10 +7,16 @@
set(qml_files
"ButtonBackground.qml"
"CheckIndicator.qml"
+ "CopyAction.qml"
+ "CutAction.qml"
+ "DeleteAction.qml"
+ "PasteAction.qml"
"RadioIndicator.qml"
+ "SelectAllAction.qml"
"SwitchIndicator.qml"
"FocusFrame.qml"
"StyleImage.qml"
+ "TextEditingContextMenu.qml"
)
qt_internal_add_qml_module(QuickControls2FluentWinUI3StyleImpl
diff --git a/src/quickcontrols/fluentwinui3/impl/CopyAction.qml b/src/quickcontrols/fluentwinui3/impl/CopyAction.qml
new file mode 100644
index 0000000000..f6df184b08
--- /dev/null
+++ b/src/quickcontrols/fluentwinui3/impl/CopyAction.qml
@@ -0,0 +1,9 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+import QtQuick.Controls.impl
+
+CopyAction {
+ icon.width: 16
+ icon.height: 16
+}
diff --git a/src/quickcontrols/fluentwinui3/impl/CutAction.qml b/src/quickcontrols/fluentwinui3/impl/CutAction.qml
new file mode 100644
index 0000000000..9e5538d0e9
--- /dev/null
+++ b/src/quickcontrols/fluentwinui3/impl/CutAction.qml
@@ -0,0 +1,9 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+import QtQuick.Controls.impl
+
+CutAction {
+ icon.width: 16
+ icon.height: 16
+}
diff --git a/src/quickcontrols/fluentwinui3/impl/DeleteAction.qml b/src/quickcontrols/fluentwinui3/impl/DeleteAction.qml
new file mode 100644
index 0000000000..689be74b13
--- /dev/null
+++ b/src/quickcontrols/fluentwinui3/impl/DeleteAction.qml
@@ -0,0 +1,9 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+import QtQuick.Controls.impl
+
+DeleteAction {
+ icon.width: 16
+ icon.height: 16
+}
diff --git a/src/quickcontrols/fluentwinui3/impl/PasteAction.qml b/src/quickcontrols/fluentwinui3/impl/PasteAction.qml
new file mode 100644
index 0000000000..c68c86f5d2
--- /dev/null
+++ b/src/quickcontrols/fluentwinui3/impl/PasteAction.qml
@@ -0,0 +1,9 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+import QtQuick.Controls.impl
+
+PasteAction {
+ icon.width: 16
+ icon.height: 16
+}
diff --git a/src/quickcontrols/fluentwinui3/impl/SelectAllAction.qml b/src/quickcontrols/fluentwinui3/impl/SelectAllAction.qml
new file mode 100644
index 0000000000..f60c29f560
--- /dev/null
+++ b/src/quickcontrols/fluentwinui3/impl/SelectAllAction.qml
@@ -0,0 +1,9 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+import QtQuick.Controls.impl
+
+SelectAllAction {
+ icon.width: 16
+ icon.height: 16
+}
diff --git a/src/quickcontrols/fluentwinui3/impl/TextEditingContextMenu.qml b/src/quickcontrols/fluentwinui3/impl/TextEditingContextMenu.qml
new file mode 100644
index 0000000000..2b921b6c59
--- /dev/null
+++ b/src/quickcontrols/fluentwinui3/impl/TextEditingContextMenu.qml
@@ -0,0 +1,31 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+import QtQuick.Controls.FluentWinUI3
+import QtQuick.Controls.FluentWinUI3.impl as FluentWinUI3Impl
+
+Menu {
+ id: menu
+ popupType: Popup.Window
+
+ required property var control
+
+ FluentWinUI3Impl.CutAction {
+ control: menu.control
+ }
+ FluentWinUI3Impl.CopyAction {
+ control: menu.control
+ }
+ FluentWinUI3Impl.PasteAction {
+ control: menu.control
+ }
+ FluentWinUI3Impl.DeleteAction {
+ control: menu.control
+ }
+
+ MenuSeparator {}
+
+ FluentWinUI3Impl.SelectAllAction {
+ control: menu.control
+ }
+}
diff --git a/src/quickcontrols/fusion/TextArea.qml b/src/quickcontrols/fusion/TextArea.qml
index 5e1ecfa905..20250656e0 100644
--- a/src/quickcontrols/fusion/TextArea.qml
+++ b/src/quickcontrols/fusion/TextArea.qml
@@ -25,6 +25,10 @@ T.TextArea {
selectedTextColor: control.palette.highlightedText
placeholderTextColor: control.palette.placeholderText
+ ContextMenu.menu: TextEditingContextMenu {
+ control: control
+ }
+
PlaceholderText {
id: placeholder
x: control.leftPadding
diff --git a/src/quickcontrols/fusion/TextField.qml b/src/quickcontrols/fusion/TextField.qml
index b358c668d8..dac0b3787b 100644
--- a/src/quickcontrols/fusion/TextField.qml
+++ b/src/quickcontrols/fusion/TextField.qml
@@ -24,6 +24,10 @@ T.TextField {
placeholderTextColor: control.palette.placeholderText
verticalAlignment: TextInput.AlignVCenter
+ ContextMenu.menu: TextEditingContextMenu {
+ control: control
+ }
+
PlaceholderText {
id: placeholder
x: control.leftPadding
diff --git a/src/quickcontrols/fusion/impl/CMakeLists.txt b/src/quickcontrols/fusion/impl/CMakeLists.txt
index 64ee4851fb..5f977f1193 100644
--- a/src/quickcontrols/fusion/impl/CMakeLists.txt
+++ b/src/quickcontrols/fusion/impl/CMakeLists.txt
@@ -8,10 +8,16 @@
set(qml_files
"ButtonPanel.qml"
"CheckIndicator.qml"
+ "CopyAction.qml"
+ "CutAction.qml"
+ "DeleteAction.qml"
+ "PasteAction.qml"
"RadioIndicator.qml"
+ "SelectAllAction.qml"
"SliderGroove.qml"
"SliderHandle.qml"
"SwitchIndicator.qml"
+ "TextEditingContextMenu.qml"
)
qt_internal_add_qml_module(QuickControls2FusionStyleImpl
diff --git a/src/quickcontrols/fusion/impl/CopyAction.qml b/src/quickcontrols/fusion/impl/CopyAction.qml
new file mode 100644
index 0000000000..f6df184b08
--- /dev/null
+++ b/src/quickcontrols/fusion/impl/CopyAction.qml
@@ -0,0 +1,9 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+import QtQuick.Controls.impl
+
+CopyAction {
+ icon.width: 16
+ icon.height: 16
+}
diff --git a/src/quickcontrols/fusion/impl/CutAction.qml b/src/quickcontrols/fusion/impl/CutAction.qml
new file mode 100644
index 0000000000..9e5538d0e9
--- /dev/null
+++ b/src/quickcontrols/fusion/impl/CutAction.qml
@@ -0,0 +1,9 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+import QtQuick.Controls.impl
+
+CutAction {
+ icon.width: 16
+ icon.height: 16
+}
diff --git a/src/quickcontrols/fusion/impl/DeleteAction.qml b/src/quickcontrols/fusion/impl/DeleteAction.qml
new file mode 100644
index 0000000000..689be74b13
--- /dev/null
+++ b/src/quickcontrols/fusion/impl/DeleteAction.qml
@@ -0,0 +1,9 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+import QtQuick.Controls.impl
+
+DeleteAction {
+ icon.width: 16
+ icon.height: 16
+}
diff --git a/src/quickcontrols/fusion/impl/PasteAction.qml b/src/quickcontrols/fusion/impl/PasteAction.qml
new file mode 100644
index 0000000000..c68c86f5d2
--- /dev/null
+++ b/src/quickcontrols/fusion/impl/PasteAction.qml
@@ -0,0 +1,9 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+import QtQuick.Controls.impl
+
+PasteAction {
+ icon.width: 16
+ icon.height: 16
+}
diff --git a/src/quickcontrols/fusion/impl/SelectAllAction.qml b/src/quickcontrols/fusion/impl/SelectAllAction.qml
new file mode 100644
index 0000000000..f60c29f560
--- /dev/null
+++ b/src/quickcontrols/fusion/impl/SelectAllAction.qml
@@ -0,0 +1,9 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+import QtQuick.Controls.impl
+
+SelectAllAction {
+ icon.width: 16
+ icon.height: 16
+}
diff --git a/src/quickcontrols/fusion/impl/TextEditingContextMenu.qml b/src/quickcontrols/fusion/impl/TextEditingContextMenu.qml
new file mode 100644
index 0000000000..5149785c13
--- /dev/null
+++ b/src/quickcontrols/fusion/impl/TextEditingContextMenu.qml
@@ -0,0 +1,31 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+import QtQuick.Controls.Fusion
+import QtQuick.Controls.Fusion.impl as FusionImpl
+
+Menu {
+ id: menu
+ popupType: Popup.Window
+
+ required property var control
+
+ FusionImpl.CutAction {
+ control: menu.control
+ }
+ FusionImpl.CopyAction {
+ control: menu.control
+ }
+ FusionImpl.PasteAction {
+ control: menu.control
+ }
+ FusionImpl.DeleteAction {
+ control: menu.control
+ }
+
+ MenuSeparator {}
+
+ FusionImpl.SelectAllAction {
+ control: menu.control
+ }
+}
diff --git a/src/quickcontrols/imagine/TextArea.qml b/src/quickcontrols/imagine/TextArea.qml
index d47ffffbd7..49492c72f7 100644
--- a/src/quickcontrols/imagine/TextArea.qml
+++ b/src/quickcontrols/imagine/TextArea.qml
@@ -33,6 +33,10 @@ T.TextArea {
verticalAlignment: Qt.AlignVCenter
placeholderTextColor: control.palette.placeholderText
+ ContextMenu.menu: TextEditingContextMenu {
+ control: control
+ }
+
PlaceholderText {
id: placeholder
x: control.leftPadding
diff --git a/src/quickcontrols/imagine/TextField.qml b/src/quickcontrols/imagine/TextField.qml
index 9c0ddd1f25..467e9cbad4 100644
--- a/src/quickcontrols/imagine/TextField.qml
+++ b/src/quickcontrols/imagine/TextField.qml
@@ -32,6 +32,10 @@ T.TextField {
placeholderTextColor: control.palette.placeholderText
verticalAlignment: Qt.AlignVCenter
+ ContextMenu.menu: TextEditingContextMenu {
+ control: control
+ }
+
PlaceholderText {
id: placeholder
x: control.leftPadding
diff --git a/src/quickcontrols/imagine/impl/CMakeLists.txt b/src/quickcontrols/imagine/impl/CMakeLists.txt
index 5dd12b5de5..08888f0d37 100644
--- a/src/quickcontrols/imagine/impl/CMakeLists.txt
+++ b/src/quickcontrols/imagine/impl/CMakeLists.txt
@@ -7,6 +7,7 @@
set(qml_files
"OpacityMask.qml"
+ "TextEditingContextMenu.qml"
)
qt_internal_add_qml_module(QuickControls2ImagineStyleImpl
diff --git a/src/quickcontrols/imagine/impl/TextEditingContextMenu.qml b/src/quickcontrols/imagine/impl/TextEditingContextMenu.qml
new file mode 100644
index 0000000000..5cf34cf978
--- /dev/null
+++ b/src/quickcontrols/imagine/impl/TextEditingContextMenu.qml
@@ -0,0 +1,31 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+import QtQuick.Controls.impl
+import QtQuick.Controls.Imagine
+
+Menu {
+ id: menu
+ popupType: Popup.Window
+
+ required property var control
+
+ CutAction {
+ control: menu.control
+ }
+ CopyAction {
+ control: menu.control
+ }
+ PasteAction {
+ control: menu.control
+ }
+ DeleteAction {
+ control: menu.control
+ }
+
+ MenuSeparator {}
+
+ SelectAllAction {
+ control: menu.control
+ }
+}
diff --git a/src/quickcontrols/ios/TextArea.qml b/src/quickcontrols/ios/TextArea.qml
index 582af1bb64..e73356ef5d 100644
--- a/src/quickcontrols/ios/TextArea.qml
+++ b/src/quickcontrols/ios/TextArea.qml
@@ -25,6 +25,10 @@ T.TextArea {
placeholderTextColor: control.palette.placeholderText
cursorDelegate: CursorDelegate {}
+ ContextMenu.menu: TextEditingContextMenu {
+ control: control
+ }
+
PlaceholderText {
id: placeholder
x: control.leftPadding
diff --git a/src/quickcontrols/ios/TextField.qml b/src/quickcontrols/ios/TextField.qml
index 4b5a1fb48e..f3e2ae7740 100644
--- a/src/quickcontrols/ios/TextField.qml
+++ b/src/quickcontrols/ios/TextField.qml
@@ -27,6 +27,10 @@ T.TextField {
verticalAlignment: Qt.AlignVCenter
cursorDelegate: CursorDelegate {}
+ ContextMenu.menu: TextEditingContextMenu {
+ control: control
+ }
+
PlaceholderText {
id: placeholder
x: control.leftPadding
diff --git a/src/quickcontrols/ios/impl/CMakeLists.txt b/src/quickcontrols/ios/impl/CMakeLists.txt
index a19704ad11..b28e5f3970 100644
--- a/src/quickcontrols/ios/impl/CMakeLists.txt
+++ b/src/quickcontrols/ios/impl/CMakeLists.txt
@@ -6,8 +6,14 @@
#####################################################################
set(qml_files
+ "CopyAction.qml"
"CursorDelegate.qml"
+ "CutAction.qml"
+ "DeleteAction.qml"
"DialogButtonBoxDelegate.qml"
+ "PasteAction.qml"
+ "SelectAllAction.qml"
+ "TextEditingContextMenu.qml"
)
qt_internal_add_qml_module(QuickControls2IOSStyleImpl
diff --git a/src/quickcontrols/ios/impl/CopyAction.qml b/src/quickcontrols/ios/impl/CopyAction.qml
new file mode 100644
index 0000000000..c66f2d605c
--- /dev/null
+++ b/src/quickcontrols/ios/impl/CopyAction.qml
@@ -0,0 +1,9 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+import QtQuick.Controls.impl
+
+CopyAction {
+ icon.width: 19
+ icon.height: 19
+}
diff --git a/src/quickcontrols/ios/impl/CutAction.qml b/src/quickcontrols/ios/impl/CutAction.qml
new file mode 100644
index 0000000000..c728dc0ef5
--- /dev/null
+++ b/src/quickcontrols/ios/impl/CutAction.qml
@@ -0,0 +1,9 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+import QtQuick.Controls.impl
+
+CutAction {
+ icon.width: 19
+ icon.height: 19
+}
diff --git a/src/quickcontrols/ios/impl/DeleteAction.qml b/src/quickcontrols/ios/impl/DeleteAction.qml
new file mode 100644
index 0000000000..930a9dfcaf
--- /dev/null
+++ b/src/quickcontrols/ios/impl/DeleteAction.qml
@@ -0,0 +1,9 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+import QtQuick.Controls.impl
+
+DeleteAction {
+ icon.width: 19
+ icon.height: 19
+}
diff --git a/src/quickcontrols/ios/impl/PasteAction.qml b/src/quickcontrols/ios/impl/PasteAction.qml
new file mode 100644
index 0000000000..0ce258d2f9
--- /dev/null
+++ b/src/quickcontrols/ios/impl/PasteAction.qml
@@ -0,0 +1,9 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+import QtQuick.Controls.impl
+
+PasteAction {
+ icon.width: 19
+ icon.height: 19
+}
diff --git a/src/quickcontrols/ios/impl/SelectAllAction.qml b/src/quickcontrols/ios/impl/SelectAllAction.qml
new file mode 100644
index 0000000000..481c3befe3
--- /dev/null
+++ b/src/quickcontrols/ios/impl/SelectAllAction.qml
@@ -0,0 +1,9 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+import QtQuick.Controls.impl
+
+SelectAllAction {
+ icon.width: 19
+ icon.height: 19
+}
diff --git a/src/quickcontrols/ios/impl/TextEditingContextMenu.qml b/src/quickcontrols/ios/impl/TextEditingContextMenu.qml
new file mode 100644
index 0000000000..a70aa94299
--- /dev/null
+++ b/src/quickcontrols/ios/impl/TextEditingContextMenu.qml
@@ -0,0 +1,31 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+import QtQuick.Controls.iOS
+import QtQuick.Controls.iOS.impl as IOSImpl
+
+Menu {
+ id: menu
+ popupType: Popup.Native
+
+ required property var control
+
+ IOSImpl.CutAction {
+ control: menu.control
+ }
+ IOSImpl.CopyAction {
+ control: menu.control
+ }
+ IOSImpl.PasteAction {
+ control: menu.control
+ }
+ IOSImpl.DeleteAction {
+ control: menu.control
+ }
+
+ MenuSeparator {}
+
+ IOSImpl.SelectAllAction {
+ control: menu.control
+ }
+}
diff --git a/src/quickcontrols/macos/TextArea.qml b/src/quickcontrols/macos/TextArea.qml
index 9dbd0863bd..8486c3b95d 100644
--- a/src/quickcontrols/macos/TextArea.qml
+++ b/src/quickcontrols/macos/TextArea.qml
@@ -3,6 +3,12 @@
import QtQuick
import QtQuick.NativeStyle as NativeStyle
+import QtQuick.Controls.macOS.impl
NativeStyle.DefaultTextArea {
+ id: control
+
+ ContextMenu.menu: TextEditingContextMenu {
+ control: control
+ }
}
diff --git a/src/quickcontrols/macos/TextField.qml b/src/quickcontrols/macos/TextField.qml
index 041b218a13..e87b435881 100644
--- a/src/quickcontrols/macos/TextField.qml
+++ b/src/quickcontrols/macos/TextField.qml
@@ -3,8 +3,13 @@
import QtQuick
import QtQuick.NativeStyle as NativeStyle
+import QtQuick.Controls.macOS.impl
NativeStyle.DefaultTextField {
id: control
readonly property Item __focusFrameTarget: control
+
+ ContextMenu.menu: TextEditingContextMenu {
+ control: control
+ }
}
diff --git a/src/quickcontrols/macos/impl/CMakeLists.txt b/src/quickcontrols/macos/impl/CMakeLists.txt
index 3e0a5af8be..6456feff2d 100644
--- a/src/quickcontrols/macos/impl/CMakeLists.txt
+++ b/src/quickcontrols/macos/impl/CMakeLists.txt
@@ -3,8 +3,14 @@
set(qml_files
"CheckIndicator.qml"
+ "CopyAction.qml"
+ "CutAction.qml"
+ "DeleteAction.qml"
+ "PasteAction.qml"
+ "SelectAllAction.qml"
"SwitchHandle.qml"
"SwitchIndicator.qml"
+ "TextEditingContextMenu.qml"
)
qt_internal_add_qml_module(QuickControls2MacOSStyleImpl
diff --git a/src/quickcontrols/macos/impl/CopyAction.qml b/src/quickcontrols/macos/impl/CopyAction.qml
new file mode 100644
index 0000000000..f6df184b08
--- /dev/null
+++ b/src/quickcontrols/macos/impl/CopyAction.qml
@@ -0,0 +1,9 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+import QtQuick.Controls.impl
+
+CopyAction {
+ icon.width: 16
+ icon.height: 16
+}
diff --git a/src/quickcontrols/macos/impl/CutAction.qml b/src/quickcontrols/macos/impl/CutAction.qml
new file mode 100644
index 0000000000..9e5538d0e9
--- /dev/null
+++ b/src/quickcontrols/macos/impl/CutAction.qml
@@ -0,0 +1,9 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+import QtQuick.Controls.impl
+
+CutAction {
+ icon.width: 16
+ icon.height: 16
+}
diff --git a/src/quickcontrols/macos/impl/DeleteAction.qml b/src/quickcontrols/macos/impl/DeleteAction.qml
new file mode 100644
index 0000000000..689be74b13
--- /dev/null
+++ b/src/quickcontrols/macos/impl/DeleteAction.qml
@@ -0,0 +1,9 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+import QtQuick.Controls.impl
+
+DeleteAction {
+ icon.width: 16
+ icon.height: 16
+}
diff --git a/src/quickcontrols/macos/impl/PasteAction.qml b/src/quickcontrols/macos/impl/PasteAction.qml
new file mode 100644
index 0000000000..c68c86f5d2
--- /dev/null
+++ b/src/quickcontrols/macos/impl/PasteAction.qml
@@ -0,0 +1,9 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+import QtQuick.Controls.impl
+
+PasteAction {
+ icon.width: 16
+ icon.height: 16
+}
diff --git a/src/quickcontrols/macos/impl/SelectAllAction.qml b/src/quickcontrols/macos/impl/SelectAllAction.qml
new file mode 100644
index 0000000000..f60c29f560
--- /dev/null
+++ b/src/quickcontrols/macos/impl/SelectAllAction.qml
@@ -0,0 +1,9 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+import QtQuick.Controls.impl
+
+SelectAllAction {
+ icon.width: 16
+ icon.height: 16
+}
diff --git a/src/quickcontrols/macos/impl/TextEditingContextMenu.qml b/src/quickcontrols/macos/impl/TextEditingContextMenu.qml
new file mode 100644
index 0000000000..4b3bd75609
--- /dev/null
+++ b/src/quickcontrols/macos/impl/TextEditingContextMenu.qml
@@ -0,0 +1,31 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+import QtQuick.Controls.macOS
+import QtQuick.Controls.macOS.impl as MacOSImpl
+
+Menu {
+ id: menu
+ popupType: Popup.Window
+
+ required property var control
+
+ MacOSImpl.CutAction {
+ control: menu.control
+ }
+ MacOSImpl.CopyAction {
+ control: menu.control
+ }
+ MacOSImpl.PasteAction {
+ control: menu.control
+ }
+ MacOSImpl.DeleteAction {
+ control: menu.control
+ }
+
+ MenuSeparator {}
+
+ MacOSImpl.SelectAllAction {
+ control: menu.control
+ }
+}
diff --git a/src/quickcontrols/material/TextArea.qml b/src/quickcontrols/material/TextArea.qml
index 99efa222cf..eadaceca66 100644
--- a/src/quickcontrols/material/TextArea.qml
+++ b/src/quickcontrols/material/TextArea.qml
@@ -38,6 +38,10 @@ T.TextArea {
Material.containerStyle: Material.Outlined
+ ContextMenu.menu: TextEditingContextMenu {
+ control: control
+ }
+
cursorDelegate: CursorDelegate { }
FloatingPlaceholderText {
diff --git a/src/quickcontrols/material/TextField.qml b/src/quickcontrols/material/TextField.qml
index 9294146fac..94b1a61a5f 100644
--- a/src/quickcontrols/material/TextField.qml
+++ b/src/quickcontrols/material/TextField.qml
@@ -38,6 +38,10 @@ T.TextField {
Material.containerStyle: Material.Outlined
+ ContextMenu.menu: TextEditingContextMenu {
+ control: control
+ }
+
cursorDelegate: CursorDelegate { }
FloatingPlaceholderText {
diff --git a/src/quickcontrols/material/impl/CMakeLists.txt b/src/quickcontrols/material/impl/CMakeLists.txt
index 774655c2ff..8132444e1d 100644
--- a/src/quickcontrols/material/impl/CMakeLists.txt
+++ b/src/quickcontrols/material/impl/CMakeLists.txt
@@ -15,6 +15,7 @@ set(qml_files
"RoundedElevationEffect.qml"
"SliderHandle.qml"
"SwitchIndicator.qml"
+ "TextEditingContextMenu.qml"
)
qt_internal_add_qml_module(QuickControls2MaterialStyleImpl
diff --git a/src/quickcontrols/material/impl/TextEditingContextMenu.qml b/src/quickcontrols/material/impl/TextEditingContextMenu.qml
new file mode 100644
index 0000000000..0d6e9bae23
--- /dev/null
+++ b/src/quickcontrols/material/impl/TextEditingContextMenu.qml
@@ -0,0 +1,31 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+import QtQuick.Controls.impl
+import QtQuick.Controls.Material
+
+Menu {
+ id: menu
+ popupType: Popup.Window
+
+ required property var control
+
+ CutAction {
+ control: menu.control
+ }
+ CopyAction {
+ control: menu.control
+ }
+ PasteAction {
+ control: menu.control
+ }
+ DeleteAction {
+ control: menu.control
+ }
+
+ MenuSeparator {}
+
+ SelectAllAction {
+ control: menu.control
+ }
+}
diff --git a/src/quickcontrols/universal/TextArea.qml b/src/quickcontrols/universal/TextArea.qml
index 8a3cdd1119..af732a7990 100644
--- a/src/quickcontrols/universal/TextArea.qml
+++ b/src/quickcontrols/universal/TextArea.qml
@@ -5,6 +5,7 @@ import QtQuick
import QtQuick.Templates as T
import QtQuick.Controls.impl
import QtQuick.Controls.Universal
+import QtQuick.Controls.Universal.impl
T.TextArea {
id: control
@@ -31,6 +32,10 @@ T.TextArea {
activeFocus ? Universal.chromeBlackMediumLowColor :
Universal.baseMediumColor
+ ContextMenu.menu: TextEditingContextMenu {
+ control: control
+ }
+
PlaceholderText {
id: placeholder
x: control.leftPadding
diff --git a/src/quickcontrols/universal/TextField.qml b/src/quickcontrols/universal/TextField.qml
index fb20779156..3fa58a2dc6 100644
--- a/src/quickcontrols/universal/TextField.qml
+++ b/src/quickcontrols/universal/TextField.qml
@@ -5,6 +5,7 @@ import QtQuick
import QtQuick.Templates as T
import QtQuick.Controls.impl
import QtQuick.Controls.Universal
+import QtQuick.Controls.Universal.impl
T.TextField {
id: control
@@ -31,6 +32,10 @@ T.TextField {
Universal.baseMediumColor
verticalAlignment: TextInput.AlignVCenter
+ ContextMenu.menu: TextEditingContextMenu {
+ control: control
+ }
+
PlaceholderText {
id: placeholder
x: control.leftPadding
diff --git a/src/quickcontrols/universal/impl/CMakeLists.txt b/src/quickcontrols/universal/impl/CMakeLists.txt
index 3bbd8e5b21..faf79407fc 100644
--- a/src/quickcontrols/universal/impl/CMakeLists.txt
+++ b/src/quickcontrols/universal/impl/CMakeLists.txt
@@ -7,8 +7,14 @@
set(qml_files
"CheckIndicator.qml"
+ "CopyAction.qml"
+ "CutAction.qml"
+ "DeleteAction.qml"
+ "PasteAction.qml"
"RadioIndicator.qml"
+ "SelectAllAction.qml"
"SwitchIndicator.qml"
+ "TextEditingContextMenu.qml"
)
qt_internal_add_qml_module(QuickControls2UniversalStyleImpl
diff --git a/src/quickcontrols/universal/impl/CopyAction.qml b/src/quickcontrols/universal/impl/CopyAction.qml
new file mode 100644
index 0000000000..dbdc61c102
--- /dev/null
+++ b/src/quickcontrols/universal/impl/CopyAction.qml
@@ -0,0 +1,9 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+import QtQuick.Controls.impl
+
+CopyAction {
+ icon.width: 20
+ icon.height: 20
+}
diff --git a/src/quickcontrols/universal/impl/CutAction.qml b/src/quickcontrols/universal/impl/CutAction.qml
new file mode 100644
index 0000000000..b0ac71f999
--- /dev/null
+++ b/src/quickcontrols/universal/impl/CutAction.qml
@@ -0,0 +1,9 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+import QtQuick.Controls.impl
+
+CutAction {
+ icon.width: 20
+ icon.height: 20
+}
diff --git a/src/quickcontrols/universal/impl/DeleteAction.qml b/src/quickcontrols/universal/impl/DeleteAction.qml
new file mode 100644
index 0000000000..08455c27c9
--- /dev/null
+++ b/src/quickcontrols/universal/impl/DeleteAction.qml
@@ -0,0 +1,9 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+import QtQuick.Controls.impl
+
+DeleteAction {
+ icon.width: 20
+ icon.height: 20
+}
diff --git a/src/quickcontrols/universal/impl/PasteAction.qml b/src/quickcontrols/universal/impl/PasteAction.qml
new file mode 100644
index 0000000000..8708871186
--- /dev/null
+++ b/src/quickcontrols/universal/impl/PasteAction.qml
@@ -0,0 +1,9 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+import QtQuick.Controls.impl
+
+PasteAction {
+ icon.width: 20
+ icon.height: 20
+}
diff --git a/src/quickcontrols/universal/impl/SelectAllAction.qml b/src/quickcontrols/universal/impl/SelectAllAction.qml
new file mode 100644
index 0000000000..81246703bd
--- /dev/null
+++ b/src/quickcontrols/universal/impl/SelectAllAction.qml
@@ -0,0 +1,9 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+import QtQuick.Controls.impl
+
+SelectAllAction {
+ icon.width: 20
+ icon.height: 20
+}
diff --git a/src/quickcontrols/universal/impl/TextEditingContextMenu.qml b/src/quickcontrols/universal/impl/TextEditingContextMenu.qml
new file mode 100644
index 0000000000..6e666bc432
--- /dev/null
+++ b/src/quickcontrols/universal/impl/TextEditingContextMenu.qml
@@ -0,0 +1,31 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+import QtQuick.Controls.Universal
+import QtQuick.Controls.Universal.impl as UniversalImpl
+
+Menu {
+ id: menu
+ popupType: Popup.Window
+
+ required property var control
+
+ UniversalImpl.CutAction {
+ control: menu.control
+ }
+ UniversalImpl.CopyAction {
+ control: menu.control
+ }
+ UniversalImpl.PasteAction {
+ control: menu.control
+ }
+ UniversalImpl.DeleteAction {
+ control: menu.control
+ }
+
+ MenuSeparator {}
+
+ UniversalImpl.SelectAllAction {
+ control: menu.control
+ }
+}
diff --git a/src/quickcontrols/windows/TextArea.qml b/src/quickcontrols/windows/TextArea.qml
index 9dbd0863bd..b9cd7c5a9b 100644
--- a/src/quickcontrols/windows/TextArea.qml
+++ b/src/quickcontrols/windows/TextArea.qml
@@ -3,6 +3,12 @@
import QtQuick
import QtQuick.NativeStyle as NativeStyle
+import QtQuick.Controls.Windows.impl as WindowsImpl
NativeStyle.DefaultTextArea {
+ id: control
+
+ ContextMenu.menu: WindowsImpl.TextEditingContextMenu {
+ control: control
+ }
}
diff --git a/src/quickcontrols/windows/TextField.qml b/src/quickcontrols/windows/TextField.qml
index 1cedb17389..e62bfe5e90 100644
--- a/src/quickcontrols/windows/TextField.qml
+++ b/src/quickcontrols/windows/TextField.qml
@@ -3,6 +3,12 @@
import QtQuick
import QtQuick.NativeStyle as NativeStyle
+import QtQuick.Controls.Windows.impl
NativeStyle.DefaultTextField {
+ id: control
+
+ ContextMenu.menu: TextEditingContextMenu {
+ control: control
+ }
}
diff --git a/src/quickcontrols/windows/impl/CMakeLists.txt b/src/quickcontrols/windows/impl/CMakeLists.txt
index 8b86db1fa3..fc16acd0e5 100644
--- a/src/quickcontrols/windows/impl/CMakeLists.txt
+++ b/src/quickcontrols/windows/impl/CMakeLists.txt
@@ -3,7 +3,13 @@
set(qml_files
"CheckIndicator.qml"
+ "CopyAction.qml"
+ "CutAction.qml"
+ "DeleteAction.qml"
+ "PasteAction.qml"
+ "SelectAllAction.qml"
"SwitchIndicator.qml"
+ "TextEditingContextMenu.qml"
)
qt_internal_add_qml_module(QuickControls2WindowsStyleImpl
diff --git a/src/quickcontrols/windows/impl/CopyAction.qml b/src/quickcontrols/windows/impl/CopyAction.qml
new file mode 100644
index 0000000000..f6df184b08
--- /dev/null
+++ b/src/quickcontrols/windows/impl/CopyAction.qml
@@ -0,0 +1,9 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+import QtQuick.Controls.impl
+
+CopyAction {
+ icon.width: 16
+ icon.height: 16
+}
diff --git a/src/quickcontrols/windows/impl/CutAction.qml b/src/quickcontrols/windows/impl/CutAction.qml
new file mode 100644
index 0000000000..9e5538d0e9
--- /dev/null
+++ b/src/quickcontrols/windows/impl/CutAction.qml
@@ -0,0 +1,9 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+import QtQuick.Controls.impl
+
+CutAction {
+ icon.width: 16
+ icon.height: 16
+}
diff --git a/src/quickcontrols/windows/impl/DeleteAction.qml b/src/quickcontrols/windows/impl/DeleteAction.qml
new file mode 100644
index 0000000000..689be74b13
--- /dev/null
+++ b/src/quickcontrols/windows/impl/DeleteAction.qml
@@ -0,0 +1,9 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+import QtQuick.Controls.impl
+
+DeleteAction {
+ icon.width: 16
+ icon.height: 16
+}
diff --git a/src/quickcontrols/windows/impl/PasteAction.qml b/src/quickcontrols/windows/impl/PasteAction.qml
new file mode 100644
index 0000000000..c68c86f5d2
--- /dev/null
+++ b/src/quickcontrols/windows/impl/PasteAction.qml
@@ -0,0 +1,9 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+import QtQuick.Controls.impl
+
+PasteAction {
+ icon.width: 16
+ icon.height: 16
+}
diff --git a/src/quickcontrols/windows/impl/SelectAllAction.qml b/src/quickcontrols/windows/impl/SelectAllAction.qml
new file mode 100644
index 0000000000..f60c29f560
--- /dev/null
+++ b/src/quickcontrols/windows/impl/SelectAllAction.qml
@@ -0,0 +1,9 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+import QtQuick.Controls.impl
+
+SelectAllAction {
+ icon.width: 16
+ icon.height: 16
+}
diff --git a/src/quickcontrols/windows/impl/TextEditingContextMenu.qml b/src/quickcontrols/windows/impl/TextEditingContextMenu.qml
new file mode 100644
index 0000000000..4f92d894f1
--- /dev/null
+++ b/src/quickcontrols/windows/impl/TextEditingContextMenu.qml
@@ -0,0 +1,31 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+import QtQuick.Controls.Windows
+import QtQuick.Controls.Windows.impl as WindowsImpl
+
+Menu {
+ id: menu
+ popupType: Popup.Window
+
+ required property var control
+
+ WindowsImpl.CutAction {
+ control: menu.control
+ }
+ WindowsImpl.CopyAction {
+ control: menu.control
+ }
+ WindowsImpl.PasteAction {
+ control: menu.control
+ }
+ WindowsImpl.DeleteAction {
+ control: menu.control
+ }
+
+ MenuSeparator {}
+
+ WindowsImpl.SelectAllAction {
+ control: menu.control
+ }
+}
diff --git a/src/quickcontrolsimpl/CMakeLists.txt b/src/quickcontrolsimpl/CMakeLists.txt
index f50e671ce9..21cb16706d 100644
--- a/src/quickcontrolsimpl/CMakeLists.txt
+++ b/src/quickcontrolsimpl/CMakeLists.txt
@@ -31,6 +31,12 @@ qt_internal_add_qml_module(QuickControls2Impl
qquickplaceholdertext.cpp qquickplaceholdertext_p.h
qquickplatformtheme.cpp qquickplatformtheme_p.h
qtquickcontrols2implglobal_p.h
+ QML_FILES
+ CopyAction.qml
+ CutAction.qml
+ DeleteAction.qml
+ PasteAction.qml
+ SelectAllAction.qml
DEFINES
QT_NO_CAST_FROM_ASCII
QT_NO_CAST_TO_ASCII
diff --git a/src/quickcontrolsimpl/CopyAction.qml b/src/quickcontrolsimpl/CopyAction.qml
new file mode 100644
index 0000000000..3ee11a9478
--- /dev/null
+++ b/src/quickcontrolsimpl/CopyAction.qml
@@ -0,0 +1,17 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+import QtQuick
+import QtQuick.Templates as T
+
+T.Action {
+ text: qsTr("Copy")
+ icon.name: "edit-copy"
+ icon.width: 24
+ icon.height: 24
+ shortcut: StandardKey.Copy
+ enabled: control.selectedText.length > 0 && control.hasOwnProperty("copy")
+ onTriggered: control.copy()
+
+ required property var control
+}
diff --git a/src/quickcontrolsimpl/CutAction.qml b/src/quickcontrolsimpl/CutAction.qml
new file mode 100644
index 0000000000..7329a70e94
--- /dev/null
+++ b/src/quickcontrolsimpl/CutAction.qml
@@ -0,0 +1,24 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+import QtQuick
+import QtQuick.Templates as T
+
+T.Action {
+ text: qsTr("Cut")
+ icon.name: "edit-cut"
+ // A few styles use these values, so set them as our default
+ // so that they can simply use us instead of defining their own actions.
+ icon.width: 24
+ icon.height: 24
+ // This ensures that QIOSMenu::filterFirstResponderActions filters out any
+ // duplicate actions (at least when QT_NO_SHORTCUT is not defined).
+ shortcut: StandardKey.Cut
+ // If the control has no cut property, Qt was built without clipboard support.
+ enabled: !control.readOnly && control.selectedText.length > 0 && control.hasOwnProperty("cut")
+ onTriggered: control.cut()
+
+ // Can't be T.Control because otherwise it would fail to assign TextField/TextArea to it,
+ // and we'd need TextFieldCutAction and TextAreaCutAction.
+ required property var control
+}
diff --git a/src/quickcontrolsimpl/DeleteAction.qml b/src/quickcontrolsimpl/DeleteAction.qml
new file mode 100644
index 0000000000..bbc88a9130
--- /dev/null
+++ b/src/quickcontrolsimpl/DeleteAction.qml
@@ -0,0 +1,17 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+import QtQuick
+import QtQuick.Templates as T
+
+T.Action {
+ text: qsTr("Delete")
+ icon.name: "edit-delete"
+ icon.width: 24
+ icon.height: 24
+ shortcut: StandardKey.Delete
+ enabled: !control.readOnly && control.selectedText.length > 0
+ onTriggered: control.remove(control.selectionStart, control.selectionEnd)
+
+ required property var control
+}
diff --git a/src/quickcontrolsimpl/PasteAction.qml b/src/quickcontrolsimpl/PasteAction.qml
new file mode 100644
index 0000000000..ad6ed5be5b
--- /dev/null
+++ b/src/quickcontrolsimpl/PasteAction.qml
@@ -0,0 +1,17 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+import QtQuick
+import QtQuick.Templates as T
+
+T.Action {
+ text: qsTr("Paste")
+ icon.name: "edit-paste"
+ icon.width: 24
+ icon.height: 24
+ shortcut: StandardKey.Paste
+ enabled: !control.readOnly && control.hasOwnProperty("paste")
+ onTriggered: control.paste()
+
+ required property var control
+}
diff --git a/src/quickcontrolsimpl/SelectAllAction.qml b/src/quickcontrolsimpl/SelectAllAction.qml
new file mode 100644
index 0000000000..63c56f6694
--- /dev/null
+++ b/src/quickcontrolsimpl/SelectAllAction.qml
@@ -0,0 +1,16 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+import QtQuick
+import QtQuick.Templates as T
+
+T.Action {
+ text: qsTr("Select All")
+ icon.name: "edit-select-all"
+ icon.width: 24
+ icon.height: 24
+ shortcut: StandardKey.SelectAll
+ onTriggered: control.selectAll()
+
+ required property var control
+}
diff --git a/src/quicktemplates/qquickcontextmenu.cpp b/src/quicktemplates/qquickcontextmenu.cpp
index de78882024..6fa3b134aa 100644
--- a/src/quicktemplates/qquickcontextmenu.cpp
+++ b/src/quicktemplates/qquickcontextmenu.cpp
@@ -11,6 +11,9 @@
#include <QtQuick/private/qquickitem_p.h>
#include <QtQuickTemplates2/private/qquickdeferredexecute_p_p.h>
#include <QtQuickTemplates2/private/qquickmenu_p.h>
+#include <QtQuickTemplates2/private/qquickmenu_p_p.h>
+#include <QtQuickTemplates2/private/qquicktextarea_p.h>
+#include <QtQuickTemplates2/private/qquicktextfield_p.h>
QT_BEGIN_NAMESPACE
@@ -227,6 +230,14 @@ bool QQuickContextMenu::event(QEvent *event)
return QObject::event(event);
}
+ // On platforms like iOS, we want to use the native edit menu.
+ // TODO: test this on Android and desktop platforms (with popupType: Popup.Native)
+ if (menu && QQuickMenuPrivate::get(menu)->resolvedPopupType() == QQuickPopup::Native
+ && (qobject_cast<const QQuickTextField *>(attacheeItem)
+ || qobject_cast<const QQuickTextArea *>(attacheeItem))) {
+ QQuickMenuPrivate::get(menu)->makeEditMenu();
+ }
+
menu->setParentItem(attacheeItem);
qCDebug(lcContextMenu) << this << "showing" << menu << "at" << posRelativeToParent;
diff --git a/src/quicktemplates/qquickmenu.cpp b/src/quicktemplates/qquickmenu.cpp
index 57ae158182..c3d86ea73c 100644
--- a/src/quicktemplates/qquickmenu.cpp
+++ b/src/quicktemplates/qquickmenu.cpp
@@ -657,6 +657,12 @@ void QQuickMenuPrivate::setNativeMenuVisible(bool visible)
}
}
+// Used by QQuickContextMenu when it's opened on a text-editing control.
+void QQuickMenuPrivate::makeEditMenu()
+{
+ handle->setMenuType(QPlatformMenu::EditMenu);
+}
+
QQuickItem *QQuickMenuPrivate::itemAt(int index) const
{
return qobject_cast<QQuickItem *>(contentModel->get(index));
diff --git a/src/quicktemplates/qquickmenu_p_p.h b/src/quicktemplates/qquickmenu_p_p.h
index 3f652dcbef..1ceb2b8284 100644
--- a/src/quicktemplates/qquickmenu_p_p.h
+++ b/src/quicktemplates/qquickmenu_p_p.h
@@ -57,6 +57,8 @@ public:
static void recursivelyDestroyNativeSubMenus(QQuickMenu *menu);
void setNativeMenuVisible(bool visible);
+ void makeEditMenu();
+
QQuickItem *itemAt(int index) const;
void insertItem(int index, QQuickItem *item);
void maybeCreateAndInsertNativeItem(int index, QQuickItem *item);
diff --git a/src/quicktemplates/qquickpopupwindow.cpp b/src/quicktemplates/qquickpopupwindow.cpp
index 643971a560..02529ecb3d 100644
--- a/src/quicktemplates/qquickpopupwindow.cpp
+++ b/src/quicktemplates/qquickpopupwindow.cpp
@@ -70,7 +70,7 @@ QQuickPopupWindow::QQuickPopupWindow(QQuickPopup *popup, QWindow *parent)
setFlags(flags);
- qCDebug(lcPopupWindow) << "Created popup window with parent:" << parent << "flags:" << flags;
+ qCDebug(lcPopupWindow) << "Created popup window" << this << "with parent" << parent;
}
QQuickPopup *QQuickPopupWindow::popup() const