【QML】定时时间控制控件

代码:

  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 }

效果:

 功能:可增减、结束时间大于起始时间、可选择时分进行增减

 

posted @ 2025-04-01 16:19  taohuaxiaochunfeng  阅读(51)  评论(0)    收藏  举报