QMLTextArea
继承onEditingFinished
来自TextEdit
,它在失去焦点或回车键时触发。(假设没有输入验证)
然而,一个不能触发onEditingFinished从TextArea
与Enter
不像TextEdit
,因为它被捕获为一个换行符。
此外,在一个单一字段的窗口中,从TextArea
中删除焦点作为背景可能是不直观的,并且大多数其他控件不接受焦点,因此用户必须单击窗口或单击菜单栏。
我如何提高用户体验触发动作一旦他们编辑了多行字符串输入字段?是否使用Ctrl+Enter
输入换行符,并在Enter
上进行编辑完成,如果是这样,将如何实现?
下面是这个场景的示例QML:
import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.4
import QtQuick.Layouts 1.3
Window {
visible: true
width: 640; height: 480
title: qsTr("Hello World")
Column {
TextArea {
implicitHeight: 200
placeholderText: qsTr("Enter description")
onEditingFinished: console.log("Editing complete")
}
Label {text: qsTr("Label")}
}
}
您可以覆盖Return键按下事件并按照您的需要处理它。如果您想使用Ctrl+Return,请检查事件中的modifiers
属性。
TextArea {
implicitHeight: 200
placeholderText: qsTr("Enter description")
onEditingFinished: console.log("Editing complete")
Keys.onReturnPressed: {
if (event.modifiers & Qt.ControlModifier) {
// Ctrl+Return
editingFinished();
}
else {
// Ignore other cases
event.accepted = false;
}
}
}
或者如果你想在不按Ctrl的情况下使用返回键,那么你可以简单地这样做:
TextArea {
implicitHeight: 200
placeholderText: qsTr("Enter description")
onEditingFinished: console.log("Editing complete")
Keys.onReturnPressed: {
editingFinished();
}
}
您可以通过自己处理简单的ReturnPressed
和ctrl+ReturnPressed
或Shift+ReturnPressed
事件来实现。
在下面的代码中,我使用Shift+ReturnPressed
作为新行:
import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.4
import QtQuick.Layouts 1.3
Window {
visible: true
width: 640; height: 480
title: qsTr("Hello World")
Column {
TextArea {
id: text_area
implicitHeight: 200
placeholderText: qsTr("Enter description")
Keys.onReturnPressed: {
if(Qt.ShiftModifier)
console.log("Editing complete")
else {
text += 'n'
text_area.cursorPosition = text_area.length
}
}
}
Label {text: qsTr("Label")}
}
}
根据Jarman (https://stackoverflow.com/a/69723941/1581658)和Farshid616 (https://stackoverflow.com/a/69724074/1581658)的答案,我想出了这个
TextArea {
implicitHeight: 200
placeholderText: qsTr("Enter description")
onEditingFinished: console.log("Editing complete")
Keys.onReturnPressed: {
if(event.modifiers & Qt.ControlModifier) {
insert(cursorPosition, "n")
}
else {
editingFinished()
}
}
}
这特别允许在按下Ctrl+Enter
时在当前光标处插入换行符,并且在按下未修改的Enter
时调用editingFinished