Qt Quick.2 TextField 的操作系统编辑/粘贴菜单

Posted

技术标签:

【中文标题】Qt Quick.2 TextField 的操作系统编辑/粘贴菜单【英文标题】:OS Edit/Paste menu for Qt Quick.2 TextField 【发布时间】:2018-04-12 09:44:57 【问题描述】:

如何在选定文本上单击鼠标右键获取 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 上的 mingw32,64。

【问题讨论】:

【参考方案1】:

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

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

所以恐怕您必须实现自己的上下文菜单。这是我想出的一个 sn-p:

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 Plasma(请看here),因为默认情况下,TextField 会在右键单击后重置选择。

【讨论】:

感谢您提供相关的 Qt 错误,我想到了类似的东西,但从未找到权威来源。

以上是关于Qt Quick.2 TextField 的操作系统编辑/粘贴菜单的主要内容,如果未能解决你的问题,请参考以下文章

Qt quick 2 绘制方法没有被调用

Qt5 和 Qt Quick 2 中的自定义实时绘图

Qt Quick 2 中 TableViewColumn 的 TableView 替换

Qt Quick 2 iOS Notch 避免

qml 和 c++ 与 qt quick 2 应用程序

Qt Quick 2 应用程序中的非本机对话框