代码:
1 import QtQuick 2.15 2 import QtQuick.Controls 2.15 3 4 ApplicationWindow { 5 width: 500 6 height: 300 7 visible: true 8 title: "飞行时间设置" 9 10 // 自定义时间选择组件 11 Component { 12 id: timeComponent 13 Row { 14 spacing: 15 15 id: timeRow // 添加根元素ID 16 property int currentHour: 0 17 property int currentMinute: 0 18 property string selectedPart: "hour" 19 20 // 时间显示区域 21 Row { 22 spacing: 5 23 // 小时显示 24 Rectangle { 25 width: 60 26 height: 50 27 color: mouseHour.containsMouse ? "#e0e0e0" : "transparent" 28 border.color: timeRow.selectedPart === "hour" ? "blue" : "transparent" 29 30 Text { 31 text: timeRow.currentHour.toString().padStart(2, '0') // 使用ID访问 32 font.pixelSize: 28 33 anchors.centerIn: parent 34 } 35 36 MouseArea { 37 id: mouseHour 38 anchors.fill: parent 39 hoverEnabled: true 40 onClicked: timeRow.selectedPart = "hour" 41 } 42 } 43 44 Text { 45 text: "时" 46 font.pixelSize: 24 47 anchors.verticalCenter: parent.verticalCenter 48 } 49 50 // 分钟显示 51 Rectangle { 52 width: 60 53 height: 50 54 color: mouseMinute.containsMouse ? "#e0e0e0" : "transparent" 55 border.color: timeRow.selectedPart === "minute" ? "blue" : "transparent" 56 57 Text { 58 text: timeRow.currentMinute.toString().padStart(2, '0') // 使用ID访问 59 font.pixelSize: 28 60 anchors.centerIn: parent 61 } 62 63 MouseArea { 64 id: mouseMinute 65 anchors.fill: parent 66 hoverEnabled: true 67 onClicked: timeRow.selectedPart = "minute" 68 } 69 } 70 71 Text { 72 text: "分" 73 font.pixelSize: 24 74 anchors.verticalCenter: parent.verticalCenter 75 } 76 } 77 78 // 共用控制按钮 79 Column { 80 spacing: 10 81 anchors.verticalCenter: parent.verticalCenter 82 83 Button { 84 width: 50 85 height: 40 86 text: "+" 87 font.pixelSize: 20 88 onClicked: { 89 if(timeRow.selectedPart === "hour") { 90 timeRow.currentHour = (timeRow.currentHour + 1) % 24 91 } else { 92 timeRow.currentMinute = (timeRow.currentMinute + 1) % 60 93 } 94 } 95 } 96 97 Button { 98 width: 50 99 height: 40 100 text: "-" 101 font.pixelSize: 20 102 onClicked: { 103 if(timeRow.selectedPart === "hour") { 104 timeRow.currentHour = (timeRow.currentHour - 1 + 24) % 24 105 } else { 106 timeRow.currentMinute = (timeRow.currentMinute - 1 + 60) % 60 107 } 108 } 109 } 110 } 111 } 112 } 113 Column { 114 anchors.centerIn: parent 115 spacing: 30 116 117 // 起始时间 118 Column { 119 spacing: 10 120 Label { 121 text: "起始飞行时间" 122 font.bold: true 123 font.pixelSize: 16 124 } 125 126 Loader { 127 sourceComponent: timeComponent 128 id: startTimeLoader 129 onLoaded: { 130 item.currentHour = 13 131 item.currentMinute = 15 132 } 133 } 134 } 135 136 // 结束时间 137 Column { 138 spacing: 10 139 Label { 140 text: "结束飞行时间" 141 font.bold: true 142 font.pixelSize: 16 143 } 144 145 Loader { 146 sourceComponent: timeComponent 147 id: endTimeLoader 148 onLoaded: { 149 item.currentHour = 15 150 item.currentMinute = 0 151 } 152 } 153 } 154 } 155 156 // 时间校验逻辑 157 Connections { 158 target: startTimeLoader.item 159 function onCurrentHourChanged() { validateTime() } 160 function onCurrentMinuteChanged() { validateTime() } 161 } 162 163 Connections { 164 target: endTimeLoader.item 165 function onCurrentHourChanged() { validateTime() } 166 function onCurrentMinuteChanged() { validateTime() } 167 } 168 169 function validateTime() { 170 if (!startTimeLoader.item || !endTimeLoader.item) return; 171 172 let start = startTimeLoader.item.currentHour * 60 + startTimeLoader.item.currentMinute 173 let end = endTimeLoader.item.currentHour * 60 + endTimeLoader.item.currentMinute 174 175 if (end < start) { 176 endTimeLoader.item.currentHour = startTimeLoader.item.currentHour 177 endTimeLoader.item.currentMinute = startTimeLoader.item.currentMinute 178 } 179 } 180 }
效果:
功能:可增减、结束时间大于起始时间、可选择时分进行增减