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

185 lines
5.4 KiB
QML
Raw Normal View History

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