Qt Quick.2 TextField的OS编辑/粘贴菜单

时间:2018-04-12 09:44:57

标签: qt qml qt5 qtquickcontrols2

右键单击所选文本,如何获取QtQuick.Controls 2 * TextField的操作系统特定粘贴菜单。

有效:

import QtQuick.Controls 1.4

TextField
{
    placeholderText: qsTr("Filter")
    selectByMouse: true
}

并给我菜单,而

import QtQuick.Controls 2.2

TextField
{
    placeholderText: qsTr("Filter")
    selectByMouse: true
}

右键单击无效。

我使用的是5.9 LTS版本,而且我已经坚持了一段时间。

它既不适用于手动安装5.9的Ubuntu Linux 16.04,也不适用于Windows 10,msys2上的mingw {32,64}。

1 个答案:

答案 0 :(得分:5)

据我所知,在Qt bug跟踪器中,它是一个缺失的功能(QTBUG-35598),即使在Qt 5.10中也是如此。

我认为恕我直言的原因是确保应用程序在平台上具有一致的外观和感觉。

所以我担心你必须实现自己的上下文菜单。这是我提出的一个片段:

property int selectStart
property int selectEnd
property int curPos

TextField
{
    id: textInput
    placeholderText: qsTr("Filter")
    selectByMouse: true

    MouseArea {
        anchors.fill: parent
        acceptedButtons: Qt.RightButton
        hoverEnabled: true
        onClicked: {
            selectStart = textInput.selectionStart;
            selectEnd = textInput.selectionEnd;
            curPos = textInput.cursorPosition;
            contextMenu.x = mouse.x;
            contextMenu.y = mouse.y;
            contextMenu.open();
            textInput.cursorPosition = curPos;
            textInput.select(selectStart,selectEnd);
        }
        onPressAndHold: {
            if (mouse.source === Qt.MouseEventNotSynthesized) {
                selectStart = textInput.selectionStart;
                selectEnd = textInput.selectionEnd;
                curPos = textInput.cursorPosition;
                contextMenu.x = mouse.x;
                contextMenu.y = mouse.y;
                contextMenu.open();
                textInput.cursorPosition = curPos;
                textInput.select(selectStart,selectEnd);
            }
        }

        Menu {
            id: contextMenu
            MenuItem {
                text: "Cut"
                onTriggered: {
                    textInput.cut()
                }
            }
            MenuItem {
                text: "Copy"
                onTriggered: {
                    textInput.copy()
                }
            }
            MenuItem {
                text: "Paste"
                onTriggered: {
                    textInput.paste()
                }
            }
        }
    }
}

保存和恢复选择的代码来自KDE等离子(看起来here),因为默认情况下TextField会在右键单击后重置选择。