C++ qml textInput.密码转换行为

C++ qml textInput.密码转换行为,c++,qt,qml,C++,Qt,Qml,我有一个关于QtVirtualKeyboard在文本和密码字段上的不同移位行为的问题 import QtQuick 2.0 import QtQuick.Controls 2.3 import QtQuick.VirtualKeyboard 2.1 import QtQuick.Window 2.0 Window { id: window width: 800 height: 480 color: "#F6F6F6" MouseAr

我有一个关于QtVirtualKeyboard在文本和密码字段上的不同移位行为的问题

import QtQuick 2.0
import QtQuick.Controls 2.3
import QtQuick.VirtualKeyboard 2.1
import QtQuick.Window 2.0

Window {
    id: window
    width: 800
    height: 480
    color: "#F6F6F6"

    MouseArea  {
        id: content
        width: window.width

        Column {
            id: textEditors
            spacing: 15
            x: 12
            y: 12
            width: parent.width - 26

            Label {
                color: "#565758"
                text: "Tap fields to enter text"
                anchors.horizontalCenter: parent.horizontalCenter
            }
            TextField {
                width: parent.width
                placeholderText: "One line field"
                inputMethodHints: Qt.ImhPreferLowercase
            }
            TextField {
                id: passwordField
                width: parent.width
                echoMode: TextField.Password
                placeholderText: "Password field"
                // changes do not work
                inputMethodHints: Qt.ImhNoAutoUppercase | Qt.ImhPreferLowercase | Qt.ImhSensitiveData | Qt.ImhNoPredictiveText
            }
        }
    }

    InputPanel {
        id: inputPanel
        z: 2
        y: window.height
        width: window.width

        states: State {
            name: "visible"
            when: inputPanel.active
            PropertyChanges {
                target: inputPanel
                y: window.height - inputPanel.height
            }
        }
        transitions: Transition {
            from: ""
            to: "visible"
            reversible: true
            ParallelAnimation {
                NumberAnimation {
                    properties: "y"
                    duration: 250
                    easing.type: Easing.InOutQuad
                }
            }
        }
    }
}
如果我点击shift
basic
TextField,只有第一个字母是大写字母。这是正确的行为。但是在
echoMode:textInput.Password上,shift有一个大写锁定功能,这是我不想要的。
是否有可能以某种方式覆盖它,或者它是一个无法更改的QT特性

谢谢

导入QtQuick 2.0
import QtQuick 2.0
import QtQuick.Controls 2.3
import QtQuick.VirtualKeyboard 2.1
import QtQuick.Window 2.0

Window {
    id: window
    width: 800
    height: 480
    color: "#F6F6F6"
    visible: true

    MouseArea  {
        id: content
        width: window.width

        Column {
            id: textEditors
            spacing: 15
            x: 12
            y: 12
            width: parent.width - 26

            Label {
                color: "#565758"
                text: "Tap fields to enter text"
                anchors.horizontalCenter: parent.horizontalCenter
            }
            TextField {
                width: parent.width
                placeholderText: "One line field"
                inputMethodHints: Qt.ImhPreferLowercase
            }
            TextField {
                id: passwordField
                width: parent.width
                echoMode: TextField.Password
                placeholderText: "Password field"
                // changes do not work
                inputMethodHints: Qt.ImhNoAutoUppercase | Qt.ImhPreferLowercase | Qt.ImhSensitiveData | Qt.ImhNoPredictiveText

                onTextChanged: console.log(text)
            }
        }
    }

    InputPanel {
        id: inputPanel
        z: 2
        y: window.height
        width: window.width

        property bool shiftActive: (InputContext == null) ? null : InputContext.shiftActive
        property variant shiftKey: null

        function findKey(parent) {
            if (parent === null) {
                return null
            }

            var children = parent.children
            if (children === undefined || children === null) {
                return null
            }

            var obj = null

            for (var i = 0; i < children.length; i++) {
                obj = children[i]

                if (obj instanceof ShiftKey) {
                    return obj
                }

                obj = findKey(obj)

                if (obj === null) {
                    continue
                }

                if (obj instanceof ShiftKey) {
                    return obj
                }
            }

            return null
        }

        Timer {
            id: timer
            interval: 0
            repeat: false
            running: false
            onTriggered: {
                inputPanel.shiftKey.clicked()
            }
        }

        Connections {
            target: (InputContext.inputItem != null && InputContext.inputItem.echoMode === TextField.Password) ? InputContext.inputItem : null
            onTextChanged: {
                if (inputPanel.shiftActive) {
                    if (inputPanel.shiftKey == null) {
                        inputPanel.shiftKey = inputPanel.findKey(inputPanel.keyboard)
                    }

                    timer.start()
                }
            }
        }


        states: State {
            name: "visible"
            when: inputPanel.active
            PropertyChanges {
                target: inputPanel
                y: window.height - inputPanel.height
            }
        }
        transitions: Transition {
            from: ""
            to: "visible"
            reversible: true
            ParallelAnimation {
                NumberAnimation {
                    properties: "y"
                    duration: 250
                    easing.type: Easing.InOutQuad
                }
            }
        }
    }
}
导入QtQuick.Controls 2.3 导入QtQuick.VirtualKeyboard 2.1 导入QtQuick.Window 2.0 窗口{ id:窗口 宽度:800 身高:480 颜色:“F6F6F6” 可见:正确 鼠耳{ id:内容 宽度:window.width 纵队{ id:文本编辑器 间距:15 x:12 y:12 宽度:parent.width-26 标签{ 颜色:“565758” 文本:“点击字段以输入文本” anchors.horizontalCenter:父级.horizontalCenter } 文本字段{ 宽度:parent.width 占位符文本:“单行字段” InputMethodHights:Qt.imhpreferellowercase } 文本字段{ id:passwordField 宽度:parent.width echoMode:TextField.Password 占位符文本:“密码字段” //改变不起作用 输入方法提示:Qt.ImhNoAutoUppercase | Qt.imhpreferellowercase | Qt.ImhSensitiveData | Qt.imhnoppredictiveText onTextChanged:console.log(文本) } } } 输入面板{ id:输入面板 z:2 y:窗高 宽度:window.width 属性bool shiftActive:(InputContext==null)?null:InputContext.shiftActive 属性变量shiftKey:null 函数findKey(父函数){ 如果(父项===null){ 返回空 } var children=parent.children if(children==未定义| | children===空){ 返回空 } var obj=null 对于(变量i=0;i
我找到了一种极端的方法。现在它不会进入大写锁定状态,工作方式类似于shift。但是没有一个选项可以以某种方式启用它

import QtQuick 2.0
import QtQuick.Controls 2.3
import QtQuick.VirtualKeyboard 2.1
import QtQuick.Window 2.0

Window {
    id: window
    width: 800
    height: 480
    color: "#F6F6F6"

    MouseArea  {
        id: content
        width: window.width

        Column {
            id: textEditors
            spacing: 15
            x: 12
            y: 12
            width: parent.width - 26

            Label {
                color: "#565758"
                text: "Tap fields to enter text"
                anchors.horizontalCenter: parent.horizontalCenter
            }
            TextField {
                width: parent.width
                placeholderText: "One line field"
            }
            TextField {
                id: passwordField
                width: parent.width
                echoMode: TextField.PasswordEchoOnEdit
                placeholderText: "Password field"
                inputMethodHints: Qt.ImhAutoUppercase | Qt.ImhPreferLowercase | Qt.ImhSensitiveData | Qt.ImhNoPredictiveText

                onTextChanged: {
                    InputContext.capsLock = false
                }
            }
        }
    }

    InputPanel {
        id: inputPanel
        z: 2
        y: window.height
        width: window.width

        states: State {
            name: "visible"
            when: inputPanel.active
            PropertyChanges {
                target: inputPanel
                y: window.height - inputPanel.height
            }
        }
        transitions: Transition {
            from: ""
            to: "visible"
            reversible: true
            ParallelAnimation {
                NumberAnimation {
                    properties: "y"
                    duration: 250
                    easing.type: Easing.InOutQuad
                }
            }
        }
    }
}

主要问题是,我希望在所有输入上都有相同的行为,而不仅仅是在本例中。

首先,感谢您的回答;)。真的需要用这种“复杂”的方式吗?不管怎么说,看起来,这是行不通的<代码>qml属性bool shiftActive:(InputContext==null)?null:InputContext.shiftActive//main.qml:50:36:无法为测试将[undefined]分配给bool
,我将其更改为
true
,但接下来会出现一些错误:
qml if(ShiftKey的obj实例){//main.qml:68:TypeError:TypeError
你的Qt版本是什么?Ubuntu的Qt版本
5.9.5
太旧了,这段代码至少可以与Qt 5.14一起使用