DiagramDesigner/PropertyEditor/resources/Qml/ValueEditor/PointFBox.qml

185 lines
5.4 KiB
QML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)
}
}
}
}