使用QML Tumbler 實現時間日期選擇器

目錄

    • 引言
    • 相關閱讀
    • 項目結構
    • 示例實現與代碼解析
      • 示例一:時間選擇器(TimePicker)
      • 示例二:日期時間選擇器(DateTimePicker)
    • 主窗口整合
    • 運行效果
    • 總結
    • 下載鏈接

引言

在現代應用程序開發中,時間與日期選擇是常見的用戶界面需求。無論是在日程安排、預約系統還是任何需要時間錄入的場景,一個直觀易用的選擇器組件可以大大提升用戶體驗。本文將詳細介紹如何使用 QML 技術實現兩種常用的選擇器組件:時間選擇器和日期時間選擇器。

相關閱讀

  • Tumbler 組件文檔

項目結構

Main.qml
TimePicker.qml
DateTimePicker.qml
main.cpp
CMakeLists.txt

示例實現與代碼解析

本項目實現了兩個實用的選擇器組件:時間選擇器(TimePicker)和日期時間選擇器(DateTimePicker)。下面將對這些組件進行詳細解析。

示例一:時間選擇器(TimePicker)

時間選擇器允許用戶通過滾動選擇特定的小時和分鐘值。這種交互方式類似于傳統的模擬時鐘調整,但提供了更為精確和直觀的數字選擇。

核心代碼:

Rectangle {id: rootwidth: 280height: 400color: "#ffffff"radius: 10border.color: "#e0e0e0"border.width: 1property int hours: hoursTumbler.currentIndexproperty int minutes: minutesTumbler.currentIndexColumnLayout {anchors.fill: parentspacing: 10Text {Layout.alignment: Qt.AlignHCentertext: "選擇時間"font.pixelSize: 20color: "#333333"Layout.topMargin: 20}Rectangle {Layout.alignment: Qt.AlignHCenterLayout.preferredWidth: parent.width - 40Layout.preferredHeight: 200color: "transparent"Row {anchors.centerIn: parentspacing: 10Tumbler {id: hoursTumblermodel: 24height: 200width: 80delegate: Text {text: modelData.toString().padStart(2, '0')color: Tumbler.tumbler.currentIndex === index ? "#1976D2" : "#666666"font.pixelSize: Tumbler.tumbler.currentIndex === index ? 22 : 18horizontalAlignment: Text.AlignHCenterverticalAlignment: Text.AlignVCenteropacity: 1.0 - Math.abs(Tumbler.displacement) / (Tumbler.tumbler.visibleItemCount / 2)}}Text {text: ":"font.pixelSize: 24anchors.verticalCenter: parent.verticalCentercolor: "#333333"}Tumbler {id: minutesTumblermodel: 60height: 200width: 80delegate: Text {text: modelData.toString().padStart(2, '0')color: Tumbler.tumbler.currentIndex === index ? "#1976D2" : "#666666"font.pixelSize: Tumbler.tumbler.currentIndex === index ? 22 : 18horizontalAlignment: Text.AlignHCenterverticalAlignment: Text.AlignVCenteropacity: 1.0 - Math.abs(Tumbler.displacement) / (Tumbler.tumbler.visibleItemCount / 2)}}}}Text {Layout.alignment: Qt.AlignHCentertext: hours.toString().padStart(2, '0') + ":" + minutes.toString().padStart(2, '0')font.pixelSize: 24color: "#1976D2"}}
}

代碼解析:

外觀設計

  • 使用 Rectangle 作為容器,設置圓角和邊框,營造現代化的界面風格
  • 采用簡潔的配色方案,主色調為藍色(#1976D2),與灰色搭配形成對比
  • 整體布局采用垂直方向的 ColumnLayout 排列元素

時間選擇邏輯

  • 使用兩個 Tumbler 組件分別控制小時(0-23)和分鐘(0-59)
  • 通過屬性綁定 property int hours: hoursTumbler.currentIndex 直接獲取選擇的值
  • 實時顯示當前選擇的時間,方便用戶確認

視覺反饋

  • 當前選中項使用突出的藍色和更大的字體
  • 通過 opacity 屬性實現滾輪效果,讓遠離中心的項逐漸變淡
  • 使用 padStart(2, '0') 確保時間始終以兩位數顯示(如 “01” 而非 “1”)

示例二:日期時間選擇器(DateTimePicker)

日期時間選擇器擴展了時間選擇的功能,增加了年、月、日的選擇,提供了完整的日期時間設置能力。

核心代碼:

Rectangle {id: rootwidth: 320height: 480color: "#ffffff"radius: 10border.color: "#e0e0e0"border.width: 1property date selectedDateTime: new Date()function updateDateTime() {if (!yearTumbler.currentItem || !dayTumbler.currentItem) return;let newDate = new Date(selectedDateTime)let year = parseInt(yearTumbler.currentItem.text)let month = monthTumbler.currentIndexlet day = parseInt(dayTumbler.currentItem.text)let hours = hoursTumbler.currentIndexlet minutes = minutesTumbler.currentIndex// 驗證日期是否有效if (isNaN(year) || isNaN(day)) return;newDate.setFullYear(year)newDate.setMonth(month)newDate.setDate(day)newDate.setHours(hours)newDate.setMinutes(minutes)if (newDate.getTime() === selectedDateTime.getTime()) return;selectedDateTime = newDate}// 計算指定年月的天數function getDaysInMonth(year, month) {return new Date(year, month + 1, 0).getDate()}Component.onCompleted: {let currentDate = new Date()yearTumbler.currentIndex = yearTumbler.model.indexOf(currentDate.getFullYear().toString())monthTumbler.currentIndex = currentDate.getMonth()dayTumbler.currentIndex = currentDate.getDate() - 1hoursTumbler.currentIndex = currentDate.getHours()minutesTumbler.currentIndex = currentDate.getMinutes()}// ... Tumbler 組件實現 ...Text {Layout.alignment: Qt.AlignHCentertext: selectedDateTime.toLocaleString(Qt.locale(), "yyyy年MM月dd日 hh:mm")font.pixelSize: 18color: "#1976D2"}
}

代碼解析:

日期時間管理

  • 使用 property date selectedDateTime 存儲完整的日期時間信息
  • 實現 updateDateTime() 函數統一處理所有 Tumbler 的變更
  • 加入錯誤處理和有效性檢查,確保日期合法

月份天數處理

  • 通過 getDaysInMonth() 函數動態計算每月天數
  • 在月份變化時自動調整日期選擇器的可選范圍
  • 避免出現無效日期(如 2 月 31 日)

初始化與數據綁定

  • Component.onCompleted 中設置初始值為當前系統時間
  • 使用 Qt.callLater() 延遲更新,避免組件初始化時的問題
  • 通過 toLocaleString() 格式化顯示完整的日期時間

錯誤處理與優化

  • 增加空值檢查,防止訪問空對象屬性
  • 添加數據有效性驗證,避免設置非法日期
  • 使用日期相等性比較,減少不必要的更新

主窗口整合

在 Main.qml 中,我們將兩個選擇器組件集成到一個統一的界面中,由于篇幅過長,此處代碼省略,詳情請看下載鏈接。

運行效果

日期選擇器


總結

本文介紹了使用 QML 實現時間選擇器和日期時間選擇器的方法與技巧。通過這個項目,我們可以得出以下幾點經驗:

  • 將 UI 元素封裝為獨立組件,增強代碼復用性和可維護性
  • 加入適當的錯誤檢查和邊界條件處理,增強程序健壯性
  • 充分利用 QML 的數據綁定特性,簡化狀態管理

下載鏈接

完整項目代碼可以從以下鏈接獲取:GitCode - DateTimePicker

GitCode

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/78003.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/78003.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/78003.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

R語言中的常用內置函數

常用的數值函數 常用的字符函數 與概率分布相關的函數 有用的統計函數 數據來源:《數據挖掘與數據分析:基于R語言》王陽 2024年1月出版

org.springframework.core.env.PropertiesPropertySource 類詳解

org.springframework.core.env.PropertiesPropertySource 類詳解 1. 基本概述 類路徑: org.springframework.core.env.PropertiesPropertySource繼承關系: 繼承自 PropertySource<Properties>&#xff0c;實現 PropertySource 接口。作用: 將 Java Properties 對象&…

2025-04-22 李沐深度學習5 —— 線性回歸

文章目錄 1 案例介紹1.1 應用場景&#xff1a;美國房價預測1.2 核心假設1.3 線性回歸與神經網絡的關系1.4 平方損失&#xff08;L2 Loss&#xff09;1.5 訓練模型&#xff1a;最小化損失 2 基礎優化算法2.1 梯度下降2.2 小批量隨機梯度下降&#xff08;Mini-batch SGD&#xff…

你的大模型服務如何壓測:首 Token 延遲、并發與 QPS

寫在前面 大型語言模型(LLM)API,特別是遵循 OpenAI 規范的接口(無論是 OpenAI 官方、Azure OpenAI,還是 DeepSeek、Moonshot 等眾多兼容服務),已成為驅動下一代 AI 應用的核心引擎。然而,隨著應用規模的擴大和用戶量的增長,僅僅關注模型的功能是不夠的,API 的性能表…

數字化轉型避坑指南:中鈞科技如何用“四個錨點”破解轉型深水區

數字化轉型浪潮下&#xff0c;企業常陷入四大典型陷阱&#xff1a;跟風式投入、數據沼澤化、流程偽在線、安全裸奔化。中鈞科技旗下產品以“經營幫”平臺為核心&#xff0c;通過針對性方案幫助企業繞開深坑。 陷阱一&#xff1a;盲目跟風&#xff0c;為數字化而數字化 許…

時分復用、頻分復用和碼分復用簡要比較分析

時分復用&#xff08;TDM&#xff09;、頻分復用&#xff08;FDM&#xff09;和碼分復用&#xff08;CDM&#xff09;是經典的多路復用技術&#xff0c;它們通過不同的方式共享信道資源。以下是兩者的詳細比較及其優缺點&#xff1a; 1. 原理對比 時分復用&#xff08;TDM&…

MCP認證難題破解:常見技術難題實戰分析與解決方案

MCP認證難題破解:常見技術難題實戰分析與解決方案 一、引言:MCP認證——智能協作領域的“技術試金石” MCP(Multi-agent Communication Protocol)認證作為多智能體系統領域的權威認證,旨在考察考生對MCP協議設計、智能體協作架構、分布式系統優化等核心技術的掌握程度。…

最新iOS性能測試方法與教程

一、工具instrument介紹 使用Xcode的instrument進行測試&#xff0c;instrument自帶了很多性能方面的測試工具&#xff0c;如圖所示&#xff1a; 二、常見性能測試內容 不管是安卓還是iOS的性能測試&#xff0c;常見的性能測試都要包含這五個方面&#xff1a; 1、內存&#xff…

Vue el-checkbox 虛擬滾動解決多選框全選卡頓問題 - 高性能處理大數據量選項列表

一、背景 在我們開發項目中&#xff0c;經常會遇到需要展示大量選項的多選框場景&#xff0c;比如權限配置、數據篩選等。當選項數量達到幾百甚至上千條時&#xff0c;傳統的渲染方式全選時會非常卡頓&#xff0c;導致性能問題。本篇文章&#xff0c;記錄我使用通過虛擬滾動實現…

JWT的token泄露要如何應對

文章目錄 前言? 一、預防措施&#xff08;防泄露&#xff09;&#x1f6a8; 二、應急響應機制&#xff08;發現已泄露&#xff09;&#x1f512; 1. **啟用 Token 黑名單機制**&#x1f501; 2. **啟用 Refresh Token 機制 旋轉令牌**&#x1f4cd; 3. **強制下線機制**&…

24.中醫知識問答刪除歷史對話功能前端代碼實現

前端實現對話刪除功能的完整指南 功能概述 前篇文章介紹了刪除歷史對話的后端開發&#xff0c;本篇將介紹如何在前端實現一個完整的對話刪除功能&#xff0c;包括用戶確認、API調用、狀態管理和錯誤處理等關鍵環節。 功能拆解 1. 用戶確認機制 javascript const confirmDe…

如何在 Python 項目中引入 Rust 函數

目錄 1. 初始化 Python 項目2. 添加 Rust 開發工具3. 初始化 Rust 項目4. 開發模式構建5. 驗證模塊是否成功安裝6. 測試 Rust 函數總結 (封面pid: 129416070) Python 是一門非常流行的編程語言&#xff0c;具有易于使用和開發的特點。然而&#xff0c;隨著項目需求的增長和性能…

Java基礎系列-HashMap源碼解析2-AVL樹

文章目錄 AVL樹左旋右旋左旋右旋的4種情況LL 型RR 型LR 型RL 型 實際插入時怎么判斷是那種類型&#xff1f;插入時注意事項刪除節點 AVL樹 為避免BST樹退化成鏈表的極端情況&#xff0c; AVL 樹應運而生。 平衡因子取值&#xff08;-1&#xff0c;0&#xff0c;1&#xff09;…

新書速覽|Hadoop與Spark大數據全景解析(視頻教學版)

《Hadoop與Spark大數據全景解析:視頻教學版》 01 本書內容 《Hadoop與Spark大數據全景解析:視頻教學版》結合作者多年在大數據領域的開發實踐經驗&#xff0c;采用“理論實戰”的形式&#xff0c;以大量實例全面介紹Hadoop和Spark的基礎知識及其高級應用。作者將豐富的教學經…

TapData × 夢加速計劃 | 與 AI 共舞,TapData 攜 AI Ready 實時數據平臺亮相加速營,企業數據基礎設施現代化

在實時躍動的數據節拍中&#xff0c;TapData 與 AI 共舞&#xff0c;踏出智能未來的新一步。 4月10日&#xff0c;由前海產業發展集團、深圳市前海夢工場、斑馬星球科創加速平臺等聯合發起的「夢加速計劃下一位獨角獸營」正式啟航。 本次加速營以“打造下一位獨角獸企業”為目…

[密碼學基礎]密碼學常用名詞深度解析:從基礎概念到實戰應用

密碼學常用名詞深度解析&#xff1a;從基礎概念到實戰應用 密碼學是信息安全的基石&#xff0c;但其專業術語常令人望而生畏。本文系統梳理密碼學領域的核心名詞&#xff0c;結合技術原理、實際應用與攻擊場景&#xff0c;幫助開發者快速構建密碼學知識框架。文中代碼示例基于…

GD32H7單片機使用segger_rtt,rtt-viewer看不到輸出的問題,怎樣解決?

jlink版本目前是792&#xff0c;但估計只要能支持h7的jlink版本應該都可以。 將segger/JLink_V792n中&#xff0c;samples文件夾、RTT中四個文件拷貝出來放在單片機目錄中 在任意代碼部分引用segger_rtt.h&#xff0c;再調用函數 即可使用rtt打印功能&#xff0c;在rtt-viewe…

快速生成安卓證書并打包生成安卓apk(保姆教程)

一.生成安卓證書 目前市面上生成可以快速生成安卓證書的網站有很多個人推薦香蕉云編以下是網站鏈接 香蕉云編-app打包上架工具類平臺 1.進入網站如下圖 2.點擊生成簽名證書 3.點擊立即創建證書 4.點擊創建安卓證書 5.按照指引完成創建 6.點擊下載就可使用 二.打包安卓apk …

前端面試場景題

目錄 1.項目第一次加載太慢優化 / vue 首屏加載過慢如何優化 2.說說了解的es6-es10的東西有哪些 ES6&#xff08;ES2015&#xff09;之后&#xff0c;JavaScript 新增了許多實用的數組和對象方法&#xff0c;下面為你詳細介紹&#xff1a; 3.常見前端安全性問題 XSS&#…

Spring JDBC 的開發步驟(注解方式)

Spring JDBC 的開發步驟主要包括以下關鍵環節&#xff0c;結合代碼示例說明如下&#xff1a; 1. 添加依賴 在 pom.xml 中引入 Spring JDBC 和數據庫驅動依賴&#xff08;以 HikariCP 連接池和 MySQL 為例&#xff09;&#xff1a; <!-- Spring JDBC --> <dependency…