实现一个点击输入框可以弹出的数字软键盘控件 qt 5.12

我们将创建两个自定义组件: 1. `NumericInputField`:一个输入框,当点击时弹出数字键盘。 2. `NumericKeyboard`:一个可缩放的数字键盘。 设计思路: - `NumericInputField` 是一个常规的输入框,但点击后会弹出 `NumericKeyboard`。 - `NumericKeyboard` 是一个弹出式键盘,它的大小可以等比例缩放(通过设置宽度,高度按比例计算)。 - 键盘内部包含数字0-9、小数点、退格、取消和确定按钮。 - 键盘的尺寸和字体大小都可以通过属性设置。 步骤: 1. 创建 `NumericKeyboard` 组件。 2. 创建 `NumericInputField` 组件,它包含一个 `TextInput` 和一个弹出键盘的机制。 3. 在 `NumericInputField` 中,当点击输入框时,显示 `NumericKeyboard`,并将键盘与输入框的位置关联(例如在输入框下方弹出)。 注意:为了支持等比例缩放,键盘的宽度可以设置,高度则根据宽度按比例计算(例如高度是宽度的0.6倍)。键盘内部的按钮大小和字体大小也根据键盘的当前尺寸进行缩放。 由于要求每个自定义组件的代码,我们将分别实现: 组件一:NumericKeyboard.qml 组件二:NumericInputField.qml 然后提供一个使用示例。

可缩放弹出式数字软键盘组件

下面我将实现一个完整的可缩放弹出式数字软键盘组件,包含两个自定义组件:NumericInputField(输入框)和 NumericKeyboard(键盘)。这两个组件都支持等比例缩放。

import QtQuick 2.12
import QtQuick.Controls 2.12
import QtQuick.Window 2.12import QtQml 2.12import QtQuick.Layouts 1.12
import "./image"import QtQuick.Layouts 1.3Window {width: 1200height: 800visible: truetitle: "可缩放弹出式数字键盘"color: "#f8fafc"ColumnLayout {anchors.fill: parentanchors.margins: 30spacing: 20// 标题Text {text: "可缩放弹出式数字键盘"font.pixelSize: 28font.bold: truecolor: "#1e293b"Layout.alignment: Qt.AlignCenter}// 示例1:基本使用NumericInputField {id: basicInputLayout.preferredWidth: 300Layout.preferredHeight: 60placeholder: "点击输入金额"Layout.alignment: Qt.AlignCenter}// 示例2:整数输入NumericInputField {id: integerInputLayout.preferredWidth: 250Layout.preferredHeight: 50placeholder: "点击输入数量"allowDecimal: false // 禁用小数点Layout.alignment: Qt.AlignCenter}// 示例3:自定义键盘大小NumericInputField {id: customSizeInputLayout.preferredWidth: 350Layout.preferredHeight: 70placeholder: "点击输入百分比"keyboardScale: 0.7 // 键盘缩放比例Layout.alignment: Qt.AlignCenter}// 控制面板RowLayout {Layout.alignment: Qt.AlignCenterspacing: 20// 键盘缩放控制Slider {id: scaleSliderfrom: 0.5to: 1.2value: 0.8Layout.preferredWidth: 200onValueChanged: {basicInput.keyboardScale = valueintegerInput.keyboardScale = valuecustomSizeInput.keyboardScale = value}}// 缩放值显示Text {text: "键盘缩放: " + scaleSlider.value.toFixed(2)font.pixelSize: 16color: "#64748b"}// 小数点开关Switch {id: decimalSwitchchecked: truetext: "允许小数点"}}// 结果展示GridLayout {columns: 3columnSpacing: 30rowSpacing: 10Layout.alignment: Qt.AlignCenterText { text: "金额:"; font.bold: true; color: "#475569" }Text { text: basicInput.text || "0.00"; color: "#334155" }Text { text: "缩放: " + basicInput.keyboardScale.toFixed(2); color: "#64748b" }Text { text: "数量:"; font.bold: true; color: "#475569" }Text { text: integerInput.text || "0"; color: "#334155" }Text { text: "缩放: " + integerInput.keyboardScale.toFixed(2); color: "#64748b" }Text { text: "百分比:"; font.bold: true; color: "#475569" }Text { text: customSizeInput.text || "0.00"; color: "#334155" }Text { text: "缩放: " + customSizeInput.keyboardScale.toFixed(2); color: "#64748b" }}}// 应用键盘设置Component.onCompleted: {integerInput.allowDecimal = decimalSwitch.checked}// 小数点开关变化Connections {target: decimalSwitchfunction onCheckedChanged() {integerInput.allowDecimal = decimalSwitch.checked}}
}
//NumericInputField
import QtQuick 2.12
import QtQuick.Controls 2.12import QtQml 2.12
import "../image"Rectangle {id: rootwidth: 300height: 60radius: 10color: "white"border.color: root.activeFocus ? "#4f46e5" : "#d1d5db"border.width: 2// ===== 公共属性 =====property alias text: inputField.text       // 输入文本property string placeholder: "点击输入"    // 占位符文本property real keyboardScale: 0.4          // 键盘缩放比例property bool allowDecimal: true          // 是否允许小数点// ===== 键盘实例 =====property NumericKeyboard keyboard: NumericKeyboard {id: numericKeyboardparent: Overlay.overlay // 确保键盘显示在最上层allowDecimal: root.allowDecimalvisible: false}// ===== 输入区域 =====TextInput {id: inputFieldanchors.fill: parentanchors.margins: 15verticalAlignment: Text.AlignVCenterfont.pixelSize: 24clip: truereadOnly: true // 只能通过键盘输入// 占位符文本Text {text: root.placeholderfont: inputField.fontcolor: "#9ca3af"visible: inputField.text.length === 0 && !root.activeFocusanchors.verticalCenter: parent.verticalCenter}}// ===== 键盘图标 =====Rectangle {width: 40height: 40radius: 20color: "#eef2ff"anchors.verticalCenter: parent.verticalCenteranchors.right: parent.rightanchors.rightMargin: 10Text {text: "⌨"font.pixelSize: 24anchors.centerIn: parent}}// ===== 点击弹出键盘 =====MouseArea {anchors.fill: parentonClicked: {// 设置键盘位置和大小numericKeyboard.width = root.width * 3 // 键盘比输入框宽
//            numericKeyboard.keyboardScale = keyboardScalenumericKeyboard.text = inputField.text// 打开键盘numericKeyboard.open()// 连接信号numericKeyboard.accepted.connect(handleAccepted)}}// ===== 键盘接受事件处理 =====function handleAccepted() {inputField.text = numericKeyboard.text}// ===== 键盘关闭时断开连接 =====Connections {target: numericKeyboardfunction onClosed() {numericKeyboard.accepted.disconnect(handleAccepted)}}// ===== 输入框获得焦点样式 =====onActiveFocusChanged: {border.color = activeFocus ? "#4f46e5" : "#d1d5db"}
}
//NumericKeyboard
import QtQuick 2.12
import QtQuick.Controls 2.12import QtGraphicalEffects 1.12
Popup {id: rootwidth: Math.min(parent.width * 0.9, 600)  // 宽度自适应,最大600pxheight: width * 0.6  // 高度按比例计算anchors.centerIn: parentmodal: truedim: trueclosePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside// ===== 公共属性 =====property alias text: inputField.text      // 绑定输入文本property bool allowDecimal: true         // 是否允许小数点property real scaleFactor: width / 600   // 缩放因子(基于600px基准)property int baseFontSize: 24            // 基准字体大小property color buttonColor: "#f0f0f0"    // 按钮默认颜色// ===== 信号 =====signal accepted()  // 点击确定时触发signal canceled() // 点击取消时触发// ===== 键盘背景 =====background: Rectangle {anchors.fill: parentcolor: "blue"radius: 10 * scaleFactorborder.color: "#d1d5db"border.width: 1 * scaleFactor// 键盘阴影效果layer.enabled: truelayer.effect: DropShadow {color: "#40000000"radius: 10 * scaleFactorsamples: 21verticalOffset: 3 * scaleFactor}}// ===== 输入框区域 =====Rectangle {id: inputContainerwidth: parent.width - 40 * scaleFactorheight: 60 * scaleFactoranchors.horizontalCenter: parent.horizontalCenteranchors.top: parent.topanchors.topMargin: 20 * scaleFactorcolor: "white"radius: 8 * scaleFactorborder.color: inputField.activeFocus ? "#4f46e5" : "#d1d5db"border.width: 2 * scaleFactor// 输入框TextInput {id: inputFieldanchors.fill: parentanchors.margins: 15 * scaleFactorfont.pixelSize: baseFontSize * scaleFactor + 4verticalAlignment: Text.AlignVCenterclip: truereadOnly: true // 禁止直接编辑// 文本改变动画Behavior on text {SequentialAnimation {PropertyAnimation {target: inputContainerproperty: "border.color"to: "#4f46e5"duration: 100}PropertyAnimation {target: inputContainerproperty: "border.color"to: "#d1d5db"duration: 300}}}}// 清除按钮Rectangle {width: 30 * scaleFactorheight: 30 * scaleFactorradius: 15 * scaleFactoranchors.verticalCenter: parent.verticalCenteranchors.right: parent.rightanchors.rightMargin: 10 * scaleFactorcolor: clearMouseArea.containsPress ? "#fee2e2" : "#fef2f2"visible: inputField.text.length > 0Text {text: "×"font.pixelSize: baseFontSize * scaleFactorcolor: "#ef4444"anchors.centerIn: parent}MouseArea {id: clearMouseAreaanchors.fill: parentonClicked: inputField.text = ""}}}// ===== 键盘网格布局 =====Grid {id: gridanchors.top: inputContainer.bottomanchors.topMargin: 20 * scaleFactoranchors.horizontalCenter: parent.horizontalCenterspacing: 10 * scaleFactorcolumns: 5// 数字键1-9Repeater {model: 9KeyButton {text: index + 1width: keyWidthheight: keyHeightonClicked: inputField.insert(inputField.cursorPosition, text)}}// 小数点键(根据allowDecimal显示/隐藏)KeyButton {text: "."width: keyWidthheight: keyHeightvisible: root.allowDecimalonClicked: {if (!inputField.text.includes(".")) {inputField.insert(inputField.cursorPosition, text)}}}// 数字0KeyButton {text: "0"width: keyWidthheight: keyHeightonClicked: inputField.insert(inputField.cursorPosition, text)}// 退格键KeyButton {text: "⌫"width: keyWidthheight: keyHeightbgColor: "#fecaca"textColor: "#b91c1c"onClicked: inputField.text = inputField.text.slice(0, -1)}// 取消键KeyButton {text: "取消"width: keyWidthheight: keyHeightbgColor: "#e5e7eb"onClicked: {root.canceled()root.close()}}// 确定键KeyButton {text: "确定"width: keyWidthheight: keyHeightbgColor: "#4f46e5"textColor: "white"onClicked: {root.accepted()root.close()}}}// ===== 计算按键尺寸 =====property real keyWidth: (root.width - 40 * scaleFactor - 2 * grid.spacing) / 6property real keyHeight: keyWidth * 0.8// ===== 弹出动画 =====enter: Transition {ParallelAnimation {NumberAnimation { property: "opacity"; from: 0; to: 1; duration: 300 }NumberAnimation { property: "scale"; from: 0.8; to: 1; duration: 300; easing.type: Easing.OutBack }}}// ===== 关闭动画 =====exit: Transition {ParallelAnimation {NumberAnimation { property: "opacity"; from: 1; to: 0; duration: 300 }NumberAnimation { property: "scale"; from: 1; to: 0.8; duration: 300 }}}
}
KeyButton
//KeyButton
import QtQuick 2.12// ===== 自定义按钮组件 =====
Rectangle {id: btnradius: 8 * root.scaleFactorcolor: mouseArea.pressed ? Qt.darker(bgColor, 1.2) : bgColorborder.color: mouseArea.pressed ? Qt.darker(borderColor, 1.2) : borderColorborder.width: 1 * root.scaleFactor// ===== 可自定义属性 =====property alias text: label.textproperty color bgColor: root.buttonColorproperty color textColor: "black"property color borderColor: "#d1d5db"// 按钮文本Text {id: labelanchors.centerIn: parentfont.pixelSize: root.baseFontSize * root.scaleFactorcolor: btn.textColor}// 鼠标区域MouseArea {id: mouseAreaanchors.fill: parentonClicked: btn.clicked()}// 点击效果动画scale: mouseArea.pressed ? 0.95 : 1.0Behavior on scale {NumberAnimation { duration: 100 }}// 点击信号signal clicked()
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/88683.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/88683.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 深入解析:JVM对象创建与内存机制全景图

第一章:引言 Java 是一种面向对象的编程语言,对象(Object)是其最基本的组成单位。Java 的“一切皆对象”不仅体现在语法层面,更体现在运行时,几乎所有数据都以对象形式存在于内存中。 然而,很…

Redis 基本操作笔记

1. Redis 简介 Redis(Remote Dictionary Server)是一个开源的、高性能的键值对存储系统,通常作为数据库、缓存、消息中间件等使用。它支持多种数据类型,包括字符串、哈希、列表、集合、有序集合等。 Redis 特点: 性能&…

Docker从环境配置到应用上云的极简路径

Docker从环境配置到应用上云的极简路径主要包括环境配置、应用容器化、选择云平台及部署应用等步骤,具体如下: - 配置Docker环境: - 安装Docker:根据操作系统下载对应版本的Docker安装包。如在Linux系统中,可使用命令…

Slicer渲染Dicom到nrrd

Slicer渲染Dicom到nrrd 工作中遇到一些处理Dicom数据的需求,个人通过网络上的一些教程 对于原始数据尝试转换到nrrd时,发现部分的窗体数据的渲染方向不一致 进一步发现这些很多定义的方向是跟设备厂家强相关的,不同厂家对于同一段的Dicom参…

QT中设计qss字体样式但是没有用【已解决】

检查一下stylesheet里面是不是有不能被QT读取的CSS语言,可能会跟字体颜色冲突错误示范:/* 错误示例:QSS 中使用 box-shadow */ QPushButton {box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); /* Qt 不支持此属性 */ }删掉就行了如果后续想用阴影…

uniapp获取状态栏高度,胶囊按钮的高度,底部安全区域的高度,自定义导航栏

相关API uni.getSystemInfoSync() uni.getMenuButtonBoundingClientRect() 创建一个utils文件夹,该文件下封装一个systemInfo.js /*** 系统信息工具类* 封装获取系统状态栏、导航栏和安全区域等相关信息的方法*/// 获取系统信息并缓存 const systemInfo uni.get…

jQuery 文本属性值

一、前言在网页开发中,我们经常需要对页面上的文本内容进行操作,例如动态修改段落文字、读取用户输入框的内容、更新按钮文本等。jQuery 提供了简洁而强大的方法来处理这些常见的文本操作需求。本文将带你全面了解 jQuery 中用于操作文本内容的三个核心方…

JAVA并发——为什么Java中的ThreadLocal对key的引用为弱引用

1、ThreadLocal 的用途 给每个线程提供自己独立的变量副本,实现线程间隔离。 常用于: 数据库连接、Session 缓存、用户上下文(如 userId)线程池中的线程复用时避免共享污染;实现线程封闭的设计模式 2、内存泄漏 使用弱…

【C++】多线程同步三剑客介绍

目录 条件变量 头文件 主要操作函数 1、等待操作 2、唤醒操作 使用示例 信号量 头文件 主要操作函数 1、信号量初始化 2、等待操作(P操作) 3、信号操作(V操作) 4、获取信号量值 5、销毁信号量 使用示例 互斥锁 …

《Java Web程序设计》实验报告八 JSP+Servlet+JDBC+MySQL实现课程管理

目 录 一、实验目的 二、实验环境 三、实验步骤和内容 1、小组成员分工(共计4人) 2、实验方案 3、实验结果与分析 4、项目任务评价 四、遇到的问题和解决方法 五、实验总结 一、实验目的 1、掌握mysql的安装、数据库表单创建 2、掌握JDBC的链接…

基于数据挖掘的课程推荐系统研究

摘要本研究设计并开发了一套基于先进数据挖掘技术的智能化课程推荐系统。该系统创新性地采用了协同过滤算法与内容推荐算法相结合的混合推荐策略,通过深度分析学生在学习平台上的历史行为数据(包括选课记录、学习时长、测试成绩等)以及课程的…

【SCI 4区推荐】《Journal of Visual Communication and Image Representation》

期刊简介:《视觉传达与图像表示杂志》(Journal of Visual Communication and Image Representation)致力于发表视觉传达与图像表示领域的最前沿研究,特别强调多学科交叉领域中的新技术和理论应用。这本期刊涵盖的研究范围广泛&…

20250711_Sudo 靶机复盘

target:192.168.43.20 外部打点 (文件上传) nmap扫一下,80,22 开放 扫目录,发现 README.md [17:04:30] 200 - 664B - /Dockerfile [17:04:38] 200 - 34KB - /LICENSE …

STEP 7-Micro/WIN SMART 编程软件:从入门到精通的使用指南

STEP 7-Micro/WIN SMART 编程软件:从入门到精通的使用指南 在工业自动化控制领域,编程软件是连接工程师与 PLC 的桥梁,而 STEP 7-Micro/WIN SMART 作为 S7-200 SMART PLC 的专用编程工具,以其友好的界面和高效的编程能力备受青睐。…

模型训练与部署注意事项篇---resize

图像大小的影响在 YOLOv 系列模型的训练和推理部署过程中,图像大小的选择是影响模型性能(精度、速度、泛化能力)的关键因素之一。两者的关系既相互关联,又存在一定的灵活性,具体可从以下几个方面详细分析:一…

【Python】venv:配置独立镜像源

为某个特定的 venv 虚拟环境设置 pip 镜像源,使得该环境下的 pip 安装始终使用自定义镜像源,不影响系统 pip,也不依赖用户级配置文件。环境准备 1. 创建虚拟环境 python -m venv venv2. 激活虚拟环境Windows: .\venv\Scripts\activateLinux/m…

日本语言学校:签证制度类 Prompt 的结构整理路径与策略

日本语言学校:签证制度类 Prompt 的结构整理路径与策略 我们在构建语言留学语义系统的过程中,尝试以“签证风险”为例,探索如何让结构信息被更好地保留下来。本文不介绍 Prompt 本身,也不夸大其作用,而是希望借此与更…

RFCOMM协议详解:串口仿真与TCP/IP协议栈移植技术——面试高频考点与真题解析

一、RFCOMM 协议核心考点与高频面试问题1.1 协议基础与核心功能考点解析:RFCOMM(Radio Frequency Communication)是蓝牙协议栈中实现串口仿真的核心协议,基于 L2CAP 协议提供类似 RS-232 的可靠数据流传输。其核心功能包括&#x…

【编程实践】利用open3d生成物体的最长边方向并可视化

1 利用3d软件生成一个长方体 边长随意,长度随意 2 导出为模型文件并采样为点云数据 从mesh表面进行采样,点数根据自己需求进行设置,此处设置为100000。采样结果:3 识别OBB外接框并可视化长边方向import numpy as np import open3d…

1. 好的设计原则

目录一、应该具备的性质二、面向对象设计原则三、详解3.1 开闭原则3.2 单一职责原则3.3 里氏替换原则3.4 依赖倒置原则3.5 接口隔离原则3.6 合成复用原则3.7 迪米特原则一、应该具备的性质 可扩展性灵活性可插入性 二、面向对象设计原则 以下设计原则的重要性从高到低排列 …