C++ qml textInput.密码转换行为
我有一个关于QtVirtualKeyboard在文本和密码字段上的不同移位行为的问题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
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
}
}
}
}
}
如果我点击shiftbasic
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一起使用