import QtQuick import QtQuick.Controls import QtQuick.Layouts Item { id: control property var value: Qt.point(0, 0) property int decimals: 2 implicitHeight: 25 implicitWidth: 120 // 设置默认宽度 signal asValueChanged(value: var) function setValue(newValue: var) { if (!control.value || Math.abs(control.value.x - newValue.x) > 0.000001 || Math.abs(control.value.y - newValue.y) > 0.000001) { value = newValue asValueChanged(value) } } RowLayout { anchors.fill: parent spacing: 4 // 减小间距 Label { text: "X:" Layout.alignment: Qt.AlignVCenter font.pixelSize: 10 } TextField { id: xBox Layout.preferredWidth: 60 // 减小宽度 Layout.preferredHeight: 22 Layout.alignment: Qt.AlignVCenter text: control.value ? control.value.x.toFixed(control.decimals) : "0.00" font.pixelSize: 10 leftPadding: 4 rightPadding: 4 selectByMouse: true // 双击全选的处理 MouseArea { id: xMouseArea anchors.fill: parent propagateComposedEvents: true acceptedButtons: Qt.LeftButton cursorShape: Qt.IBeamCursor onDoubleClicked: function(mouse) { parent.selectAll() parent.forceActiveFocus() mouse.accepted = true } onClicked: function(mouse) { // 单击时设置焦点但不全选 parent.forceActiveFocus() mouse.accepted = false } } onActiveFocusChanged: { if (activeFocus) { // 如果不是双击触发的焦点变化,就全选文本 if (!xMouseArea.containsPress) { selectAll() } } } validator: DoubleValidator { bottom: -999999 top: 999999 decimals: 2 } background: Rectangle { color: xBox.enabled ? "white" : "#f0f0f0" border.color: xBox.activeFocus ? "#2196F3" : "#cccccc" border.width: 1 radius: 2 } onEditingFinished: { var xValue = parseFloat(text) if (!isNaN(xValue) && control.value) { control.setValue(Qt.point(xValue, control.value.y)) } else { xBox.text = control.value ? control.value.x.toFixed(control.decimals) : "0.00" } } } Label { text: "Y:" Layout.alignment: Qt.AlignVCenter font.pixelSize: 10 } TextField { id: yBox Layout.preferredWidth: 60 Layout.preferredHeight: 22 Layout.alignment: Qt.AlignVCenter text: control.value ? control.value.y.toFixed(control.decimals) : "0.00" font.pixelSize: 10 leftPadding: 4 rightPadding: 4 selectByMouse: true // 双击全选的处理 MouseArea { id: yMouseArea anchors.fill: parent propagateComposedEvents: true acceptedButtons: Qt.LeftButton cursorShape: Qt.IBeamCursor onDoubleClicked: function(mouse) { parent.selectAll() parent.forceActiveFocus() mouse.accepted = true } onClicked: function(mouse) { // 单击时设置焦点但不全选 parent.forceActiveFocus() mouse.accepted = false } } onActiveFocusChanged: { if (activeFocus) { // 如果不是双击触发的焦点变化,就全选文本 if (!yMouseArea.containsPress) { selectAll() } } } validator: DoubleValidator { bottom: -999999 top: 999999 decimals: 2 } background: Rectangle { color: yBox.enabled ? "white" : "#f0f0f0" border.color: yBox.activeFocus ? "#2196F3" : "#cccccc" border.width: 1 radius: 2 } onEditingFinished: { var yValue = parseFloat(text) if (!isNaN(yValue) && control.value) { control.setValue(Qt.point(control.value.x, yValue)) } else { yBox.text = control.value ? control.value.y.toFixed(control.decimals) : "0.00" } } } Item { Layout.fillWidth: true } } // 当value从外部改变时,更新输入框显示 onValueChanged: { if (value) { if (!xBox.activeFocus) { xBox.text = value.x.toFixed(decimals) } if (!yBox.activeFocus) { yBox.text = value.y.toFixed(decimals) } } } }