当前位置: 首页 > news >正文

Qt实现自定义QDoubleSpinBox软键盘

在Qt应用程序开发中,经常会遇到需要自定义输入控件的需求。其中,对于QDoubleSpinBox控件,如果希望在点击时弹出一个自定义的软键盘,以便用户输入数值,并将输入的值设置给QDoubleSpinBox,该如何实现呢?

在本文中,我们将介绍如何使用Qt框架,结合自定义的软键盘,实现一个可以在QDoubleSpinBox控件下方弹出的数字输入解决方案。我们将从头开始构建这个功能,并逐步引导您完成实现过程。

首先,我们将创建一个名为CustomDoubleSpinBox的自定义控件,它是QDoubleSpinBox的子类。我们将重写focusInEvent函数,该函数在QDoubleSpinBox获取焦点时被调用。在这个函数中,我们将创建并显示我们自己设计的软键盘CustomKeyboard,并确保它在QDoubleSpinBox的下方弹出。

接着,我们将继续创建CustomKeyboard类,它是一个继承自QWidget的自定义控件。在CustomKeyboard中,我们将实现一个数字键盘,允许用户输入数字,并在确认后返回输入的数值。

#ifndef CUSTOMKEYBOARD_H
#define CUSTOMKEYBOARD_H#include <QObject>
#include <QWidget>
#include <QDebug>
#include <QLabel>
#include <QGridLayout>
#include <QPushButton>
#include <QDebug>class CustomKeyboard : public QWidget
{Q_OBJECTpublic:explicit CustomKeyboard(QWidget *parent = nullptr);double getValue() const;signals:void confirmed(double);private:QString currentValue;QLabel *m_pCurrentLab;private slots:void on_digitButton_clicked();void on_decimalButton_clicked();void on_backspaceButton_clicked();void on_clearButton_clicked();void on_confirmButton_clicked();void on_closeButton_clicked();};#endif // CUSTOMKEYBOARD_H

#include "customkeyboard.h"CustomKeyboard::CustomKeyboard(QWidget *parent) : QWidget(parent)
{this->setWindowFlag(Qt::FramelessWindowHint);QVBoxLayout *layout = new QVBoxLayout;currentValue = "";m_pCurrentLab = new QLabel();QGridLayout *gridLayout = new QGridLayout;gridLayout->addWidget(m_pCurrentLab,0,0,1, 3);m_pCurrentLab->setStyleSheet("color:black");for (int i = 0; i <= 9; ++i){QPushButton *digitButton = new QPushButton(QString::number(i));connect(digitButton, &QPushButton::clicked, this, &CustomKeyboard::on_digitButton_clicked);if(i == 9){gridLayout->addWidget(digitButton, 4, 1);}elsegridLayout->addWidget(digitButton, i / 3 +1, i % 3+1);}QPushButton *decimalButton = new QPushButton(".");connect(decimalButton, &QPushButton::clicked, this, &CustomKeyboard::on_decimalButton_clicked);gridLayout->addWidget(decimalButton, 4, 2);QPushButton *backspaceButton = new QPushButton("Backspace");connect(backspaceButton, &QPushButton::clicked, this, &CustomKeyboard::on_backspaceButton_clicked);gridLayout->addWidget(backspaceButton, 5, 2);QPushButton *clearButton = new QPushButton("Clear");connect(clearButton, &QPushButton::clicked, this, &CustomKeyboard::on_clearButton_clicked);gridLayout->addWidget(clearButton,4, 3);QPushButton *confirmButton = new QPushButton("Confirm");connect(confirmButton, &QPushButton::clicked, this, &CustomKeyboard::on_confirmButton_clicked);gridLayout->addWidget(confirmButton, 5, 1, 1, 1);QPushButton *closeButton = new QPushButton("Close");connect(closeButton, &QPushButton::clicked, this, &CustomKeyboard::on_closeButton_clicked);gridLayout->addWidget(closeButton, 5, 3, 1, 1);layout->addLayout(gridLayout);setLayout(layout);this->setStyleSheet("QLabel{font: 22px;color:white;}\QPushButton{background-color:rgb(42, 49, 66);border: 1px solid rgb(206,206,206);border-radius: 5px;font:18px;Min-width:112px;Max-width:112px;Min-height:35px;color:white}\QPushButton:hover{background-color:rgb(210,210,210);}\QPushButton:pressed{background-color:rgb(160,160,160);}");}double CustomKeyboard::getValue() const{return currentValue.toDouble();}void CustomKeyboard::on_digitButton_clicked(){QPushButton *clickedButton = qobject_cast<QPushButton*>(sender());currentValue += clickedButton->text();m_pCurrentLab->setText(currentValue);}void CustomKeyboard::on_decimalButton_clicked(){if (!currentValue.contains('.')){currentValue += '.';}m_pCurrentLab->setText(currentValue);}void CustomKeyboard::on_backspaceButton_clicked(){currentValue.chop(1);m_pCurrentLab->setText(currentValue);}void CustomKeyboard::on_clearButton_clicked(){currentValue = "0";m_pCurrentLab->setText(currentValue);}void CustomKeyboard::on_confirmButton_clicked(){emit confirmed(getValue());}void CustomKeyboard::on_closeButton_clicked(){this->close();this->deleteLater();}

在完成这两个自定义控件的设计后,我们将把它们组合在一起,实现自定义的QDoubleSpinBox软键盘功能。当用户点击QDoubleSpinBox控件时,我们的自定义软键盘将弹出,并在用户输入数字后自动设置给QDoubleSpinBox,使整个输入流程更加便捷和友好。

// customdoublespinbox.h#ifndef CUSTOMDOUBLESPINBOX_H
#define CUSTOMDOUBLESPINBOX_H#include <QDoubleSpinBox>
#include "customkeyboard.h"class CustomDoubleSpinBox : public QDoubleSpinBox
{Q_OBJECTpublic:explicit CustomDoubleSpinBox(QWidget *parent = nullptr);protected:void focusInEvent(QFocusEvent *event) override;private:CustomKeyboard *keyboard;
};#endif // CUSTOMDOUBLESPINBOX_H
// customdoublespinbox.cpp#include "customdoublespinbox.h"
#include <QFocusEvent>
#include <QApplication>
#include <QDesktopWidget>CustomDoubleSpinBox::CustomDoubleSpinBox(QWidget *parent) : QDoubleSpinBox(parent)
{// 初始化成员变量keyboard = nullptr;
}void CustomDoubleSpinBox::focusInEvent(QFocusEvent *event)
{// 在QDoubleSpinBox获取焦点时弹出软键盘if (keyboard == nullptr){// 获取主屏幕的尺寸QRect primaryScreenRect = QApplication::primaryScreen()->geometry();// 创建一个 CustomKeyboard 实例keyboard = new CustomKeyboard(this);connect(keyboard, &CustomKeyboard::confirmed, [this]() {// 从 CustomKeyboard 获取输入的值并设置给 QDoubleSpinBoxdouble value = this->valueFromText(QString::number(keyboard->getValue()));this->setValue(value);keyboard->deleteLater(); // 关闭软键盘});// 将 CustomKeyboard 设置为 QDoubleSpinBox 的特殊键盘this->setSpecialValueText(" ");this->setKeyboardTracking(false);// 获取 QDoubleSpinBox 在主窗口中的位置QPoint spinBoxPos = this->mapToGlobal(QPoint(0, this->height()));// 设置 CustomKeyboard 在 QDoubleSpinBox 下方弹出keyboard->move(spinBoxPos.x(), spinBoxPos.y());keyboard->show();}QDoubleSpinBox::focusInEvent(event);
}

通过本文的介绍和示例代码,您将学会如何在Qt应用程序中实现自定义的QDoubleSpinBox软键盘功能。这将为您的应用程序带来更好的用户体验,并增加交互性。如果您对此功能感兴趣,可以参考本文提供的示例代码,并将其应用于您自己的项目中。

 

希望本文对您有所帮助,并且能够在Qt应用程序开发中为您带来更多灵活、个性化的控件定制体验。如果您有任何问题或建议,欢迎在评论区留言,我们将竭诚为您解答。谢谢阅读!

相关文章:

Qt实现自定义QDoubleSpinBox软键盘

在Qt应用程序开发中&#xff0c;经常会遇到需要自定义输入控件的需求。其中&#xff0c;对于QDoubleSpinBox控件&#xff0c;如果希望在点击时弹出一个自定义的软键盘&#xff0c;以便用户输入数值&#xff0c;并将输入的值设置给QDoubleSpinBox&#xff0c;该如何实现呢&#…...

小研究 - 微服务系统服务依赖发现技术综述(一)

微服务架构得到了广泛的部署与应用, 提升了软件系统开发的效率, 降低了系统更新与维护的成本, 提高了系统的可扩展性. 但微服务变更频繁、异构融合等特点使得微服务故障频发、其故障传播快且影响大, 同时微服务间复杂的调用依赖关系或逻辑依赖关系又使得其故障难以被及时、准确…...

2023-08-07力扣今日八题

链接&#xff1a; 剑指 Offer 50. 第一个只出现一次的字符 题意&#xff1a; 如题 解&#xff1a; map存下标&#xff0c;由于存在下标0&#xff0c;所以用find&#xff0c;或者记录下标1也可以 实际代码&#xff1a; #include<bits/stdc.h> using namespace std;…...

Segment Anything【论文翻译】

文章目录 论文基础信息如下Abstract1. Introduction2. Segment Anything Task3. Segment Anything Model4. Segment Anything Data Engine5. Segment Anything Dataset6. Segment Anything RAI Analysis7. Zero-Shot Transfer Experiments7.1. Zero-Shot Single Point Valid Ma…...

银河麒麟QT连接DM8数据库

1. 安装达梦8 官网下载, 按照官方文档进行安装即可. 2. 安装unixodbc 1> 下载odbc安装包 unixODBC-2.3.7pre.tar.gz 2> 解压 tar -xvf unixODBC-2.3.7pre.tar.gz3> 编译 ./configure -prefix /usr/local make && make install4> 查找配置 odbcinst -j5…...

并发编程1:线程安全性概述

目录 1、什么是线程安全性&#xff1f; 2、操作的原子性&#xff1a;避免竞态条件 3、锁机制&#xff1a;内置锁和可重入 4、如何用锁来保护状态&#xff1f; 5、同步机制中的活跃性与性能问题 编写线程安全的代码&#xff0c;其核心在于对状态访问操作进行管理&#xff0…...

(论文复现)DeepAnt模型复现及应用

DeepAnt论文如下&#xff0c;其主要是用于时间序列的无监督粗差探测。 其提出的模型架构如下&#xff1a; 该文提出了一个无监督的时间序列粗差探测模型&#xff0c;其主要有预测模块和探测模块组成&#xff0c;其中预测模块的网络结构如下。 预测结构是将时间序列数据组…...

【机器学习】在 MLOps构建项目 ( MLOps2)

My MLOps tutorials: Tutorial 1: A Beginner-Friendly Introduction to MLOps教程 2&#xff1a;使用 MLOps 构建机器学习项目 一、说明 如果你希望将机器学习项目提升到一个新的水平&#xff0c;MLOps 是该过程的重要组成部分。在本文中&#xff0c;我们将以经典手写数字分类…...

【MySQL】聚合函数与分组查询

文章目录 一、聚合函数1.1 count 返回查询到的数据的数量1.2 sum 返回查询到的数据的总和1.3 avg 返回查询到的数据的平均值1.4 max 返回查询到的数据的最大值1.5 min 返回查询到的数据的最小值 二、分组查询group by2.1 导入雇员信息表2.2 找到最高薪资和员工平均薪资2.3 显示…...

conda 环境 numpy 安装报错需要 Microsoft Visual C++ 14.0

到公司装深度学校环境。项目较旧&#xff0c;安装依赖&#xff0c;一堆报错&#xff08;基于 conda 环境&#xff09;&#xff1a; numpy 安装报需要 C 14.0 No module named numpy.distutils._msvccompiler in numpy.distutils; trying from distutilserror: Microsoft Visu…...

算法工程师-机器学习面试题总结(5)

什么是信息熵&#xff1f; 信息熵是信息理论中用来衡量一个随机变量的不确定度或者信息量的概念。它是在给定一组可能的事件中&#xff0c;对每个事件发生的概率进行加权平均得到的值。 在信息熵的计算中&#xff0c;概率越大的事件所带来的信息量越小&#xff0c;概率越小的事…...

论文阅读 RRNet: A Hybrid Detector for Object Detection in Drone-captured Images

文章目录 RRNet: A Hybrid Detector for Object Detection in Drone-captured ImagesAbstract1. Introduction2. Related work3. AdaResampling4. Re-Regression Net4.1. Coarse detector4.2. Re-Regression 5. Experiments5.1. Data augmentation5.2. Network details5.3. Tra…...

js执行机制

JavaScript 的执行机制是基于单线程的事件循环模型。这意味着 JavaScript 代码会按照顺序一行一行地执行&#xff0c;同时只能执行一个任务。让我们更详细地了解 JavaScript 的执行机制&#xff1a; 调用栈&#xff08;Call Stack&#xff09;&#xff1a; JavaScript 使用调用…...

关于策略模式的注入问题

上面抄别人的 当在实现策略方法时&#xff0c;报null&#xff0c;排查后发现是接口实现有多个&#xff0c;需要添加别名 注入时添加Qeualifier&#xff0c;指定名称&#xff0c;如下图&#xff1b;如图上修改&#xff0c; 测试类中不用new具体行为策略了&#xff0c;注入别名即…...

通用Mapper的四个常见注解

四个常见注解 1、Table 作用&#xff1a;建立实体类和数据库表之间的对应关系。 默认规则&#xff1a;实体类类名首字母小写作为表名&#xff0c;如 Employee -> employee 表 用法&#xff1a;在 Table 注解的 name 属性中指定目标数据库的表名&#xff1b; 案例&#…...

二进制安装K8S(单Master集群架构)

目录 一&#xff1a;操作系统初始化配置 1、项目拓扑图 2、服务器 3、初始化操作 二&#xff1a; 部署 etcd 集群 1、etcd 介绍 2、准备签发证书环境 3、master01 节点上操作 &#xff08;1&#xff09;生成Etcd证书 &#xff08;2&#xff09;创建用于存放 etcd 配置文…...

基于java汽车销售分析与管理系统设计与实现

摘 要 计算机现在已成为人们办公和生活不可或缺的组成部分&#xff0c;在工作范畴计算机成熟运用大大提升了工作人员的工作效率&#xff0c;化繁为简&#xff0c;加速社会经济发展。在生活上&#xff0c;人们可以通过计算机互联网更快的了解到全球时事要闻、听到最新潮流音乐、…...

Glass指纹识别工具,多线程Web指纹识别工具-Chunsou

Glass指纹识别工具&#xff0c;多线程Web指纹识别工具-Chunsou。 Glass指纹识别工具 Glass一款针对资产列表的快速指纹识别工具&#xff0c;通过调用Fofa/ZoomEye/Shodan/360等api接口快速查询资产信息并识别重点资产的指纹&#xff0c;也可针对IP/IP段或资产列表进行快速的指…...

BIO,NIO,AIO总结

文章目录 1. BIO (Blocking I/O)1.1 传统 BIO1.2 伪异步 IO1.3 代码示例 1.4 总结2. NIO (New I/O)2.1 NIO 简介2.2 NIO的特性/NIO与IO区别1)Non-blocking IO&#xff08;非阻塞IO&#xff09;2)Buffer(缓冲区)3)Channel (通道)4)Selector (选择器) 2.3 NIO 读数据和写数据方式…...

[腾讯云Cloud Studio实战训练营]基于Cloud Studio完成图书管理系统

[腾讯云Cloud Studio实战训练营]基于Cloud Studio完成图书管理系统 ⭐前言&#x1f31c;Cloud Studio产品介绍1.登录2.创建工作空间3.工作空间界面简介4.环境的使用 ⭐实验实操&#x1f31c;Cloud Studio实现图书管理系统1.实验目的 2. 实验过程2.实验环境3.源码讲解3.1添加数据…...

(二)Node.js 基础模块

&#xff08;二&#xff09;Node.js 基础模块 1. fs文件系统模块1.1 什么是fs文件系统模块1.2 读取指定文件中的内容1. fs.readFile()的语法格式2. fs.readFile()的示例代码 1.3 向指定的文件中写入内容1. fs.writeFile()的语法格式2. fs.writeFile()的实例代码 1.4 __dirname …...

AUC及其拓展GAUC

AUC及其拓展GAUC auc的定义 auc用来评估一个分类器的排序质量&#xff0c;它的物理含义&#xff1a;给定一堆正负样本&#xff0c;随机取一个正样本&#xff0c;一个负样本&#xff0c;学习器将正样本排在负样本前面的概率 auc的计算 具体计算方法&#xff1a;给定m个正样本…...

【CSS】CSS 选择器

CSS 选择器 1.基础选择器 1.1 元素选择器 语法&#xff1a;标签名{...} 元素选择器会选中对应标签名的HTML元素&#xff0c;例如&#xff1a;p{...}&#xff0c;div{...}&#xff0c;span{...}等 1.2 类选择器 语法&#xff1a;.类名{...} 类选择器会选中class属性为指定…...

2023-08-07力扣今日四题-好题

链接&#xff1a; 剑指 Offer 03. 数组中重复的数字 题意&#xff1a; 如题 解&#xff1a; 看到一个很牛的时间复杂度O(n)的原地算法&#xff1a;由于数组长度n&#xff0c;数组内只有0到n-1&#xff0c;那么&#xff0c;我们用对应-n到-1表示nums[index]出现过一次&…...

Packet Tracer - IPv4 和 IPv6 编址故障排除

Packet Tracer - IPv4 和 IPv6 编址故障排除 地址分配表 设备 接口 IPv4 地址 子网掩码 默认网关 IPv6 地址/前缀 R1 G0/0 10.10.1.1 255.255.255.0 N/A G0/1 192.168.0.1 255.255.255.0 N/A 2001:DB8:1:1::1/64 N/A G0/2 2001:DB8:1:2::1/64 N/A S0/0/0 …...

PHP国外在线教育系统源码 在线课程系统源码 直播课程系统源码提供在线课程,现场课程,测验

Proacademy是在线教育一体化的解决方案&#xff0c;用于创建类似于Udemy、Skillshare、Coursera这种在线教育市场。 这个平台提供在线课程&#xff0c;现场课程&#xff0c;测验等等&#xff0c;并有一个基于实际业务需要的高级认证插件&#xff0c;程序基于Laravel强大的安全框…...

Abaqus 中最常用的子程序有哪些 硕迪科技

在ABAQUS中&#xff0c;用户定义的子程序是一种重要的构件&#xff0c;可以将其插入到Abaqus分析中以增强该软件的功能和灵活性。这些子程序允许用户在分析过程中添加自定义材料模型、边界条件、初始化、加载等特定操作&#xff0c;以便更精准地模拟分析中的现象和现象。ABAQUS…...

容器——3.Collection 子接口之 Set

文章目录 3.1. comparable 和 Comparator 的区别3.1.1. Comparator 定制排序3.1.2. 重写 compareTo 方法实现按年龄来排序 3.2. 无序性和不可重复性的含义是什么3.3. 比较 HashSet、LinkedHashSet 和 TreeSet 三者的异同 3.1. comparable 和 Comparator 的区别 comparable 接口…...

将整数,结构体,结构体数组,链表写到文件

在之前的学习中&#xff0c;忘文件中写的内容都是字符串或字符&#xff0c;本节学习如何写入其他各种类型的数据。 回看write和read函数的形式&#xff1a; ssize_t write(int fd, const void *buf, size_t count); ssize_t read(int fd, void *buf, size_t count); 其中&a…...

UNIX基础知识:UNIX体系结构、登录、文件和目录、输入和输出、程序和进程、出错处理、用户标识、信号、时间值、系统调用和库函数

引言&#xff1a; 所有的操作系统都为运行在其上的程序提供服务&#xff0c;比如&#xff1a;执行新程序、打开文件、读写文件、分配存储区、获得系统当前时间等等 1. UNIX体系结构 从严格意义上来说&#xff0c;操作系统可被定义为一种软件&#xff0c;它控制计算机硬件资源&…...