【QT】QT中的软键盘设计

QT的软键盘设计

  • 1.软键盘制作步骤
  • 2.介绍有关函数的使用
  • 3.出现的编译错误及解决办法
    • 示例代码1:按键事件实现软键盘
    • 现象:
    • 示例代码2:按键事件实现软键盘(加特殊按键)
    • 现象:
  • 软键盘移植到新的工程的步骤:
  • 自定义软键盘设计步骤:图示

QT中右键提升一个组件:作用就是把这个组件的类型变成提升之后的新类型,若程序员自己想要自定义实现某个控件的功能,就可用该功能

1.软键盘制作步骤

第一步:在QT工程中新添加一个软键盘的ui(模板选择QWidget),并布局好软键盘的ui顺便把按钮的focusPolicy这个属性改成noFocus(没有鼠标焦点,鼠标光标不会在按钮上停留)
第二步:在你的主窗口中拖一个widget(等一会软键盘嵌套到这个widget中来显示的),右键点击widget,选择提升为刚才新建的软键盘类
第三步:实现软键盘的代码逻辑(让软键盘可以使用)思路一:使用传统的方法,信号与槽(很麻烦)思路二:使用QT中的按键事件来实现软键盘在QT工程新增一个mybutton的类继承QPushButton(按钮类),关联信号与槽函数,在槽函数中实现按键的逻辑
第四步:mybutton里面的槽函数代码如下//获取信号的发送者QPushButton *p=qobject_cast<QPushButton *>(sender());QString str=p->text(); // 获取按钮的字面值//按照事件产生的流程去写代码//自定义一个按键事件QKeyEvent *keyevent=new QKeyEvent(QEvent::KeyPress,str.toInt()-32,Qt::NoModifier,str);//把这个按键事件发送出去--》发送个鼠标光标聚集的组件QCoreApplication::postEvent(QApplication::focusWidget(),keyevent);

2.介绍有关函数的使用

QKeyEvent::QKeyEvent(Type type, int key, Qt::KeyboardModifiers modifiers, const QString &text = QString())参数: type --》事件类型  QEvent::KeyPresskey --》按键的键值 摸索规律:字母按键(无论大小写)键值  A/a   65B/b   66modifiers --》你是否使用了某个组合键Qt::NoModifier  //没有使用组合键Qt::ShiftModifier  //使用了shift按键text --》点击的按键的字面值
//把指定的事件发送出去
[static] void QCoreApplication::postEvent(QObject *receiver, QEvent *event)参数:receiver --》事件的接收者event --》要发送的某种事件
//鼠标的光标停留在哪个组件上,该函数立马返回这个组件的地址
[static] QWidget *QApplication::focusWidget()  //返回鼠标光标聚集的组件

3.出现的编译错误及解决办法

第一个:QObject::connect: No such slot QPushButton::fun() in ..\solfkeydemo\mybutton.cpp:6原因:你的mybutton这个类中使用了信号与槽,忘记添加Q_OBJECT这个宏定义了解决方法:在mybutton的头文件中把Q_OBJECT这个宏定义加上即可
第二个:C:\Users\PC\Desktop\share\solfkeydemo\mybutton.cpp:3: error: undefined reference to `vtable for mybutton'解决方法:把编译产生的临时文件全部删除,重新打开工程,再次编译   

示例代码1:按键事件实现软键盘

当前目录结构:
在这里插入图片描述

// widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QDebug>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;
};
#endif // WIDGET_H// widget.cpp
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);qDebug()<<"Widget::Widget 构造";
}Widget::~Widget()
{delete ui;
}
//=======================================================//
// soft_keyboard.h
#ifndef SOFT_KEYBOARD_H
#define SOFT_KEYBOARD_H#include <QWidget>
#include <QDebug>namespace Ui {
class soft_keyboard;
}class soft_keyboard : public QWidget
{Q_OBJECTpublic:explicit soft_keyboard(QWidget *parent = nullptr);~soft_keyboard();private:Ui::soft_keyboard *ui;
};#endif // SOFT_KEYBOARD_H// soft_keyboard.cpp
#include "soft_keyboard.h"
#include "ui_soft_keyboard.h"soft_keyboard::soft_keyboard(QWidget *parent) :QWidget(parent),ui(new Ui::soft_keyboard)
{ui->setupUi(this);qDebug()<<"soft_keyboard::soft_keyboard 构造";
}soft_keyboard::~soft_keyboard()
{delete ui;
}
//=======================================================//
// custom_button.h
#ifndef CUSTOM_BUTTON_H
#define CUSTOM_BUTTON_H#include <QPushButton>
#include <QDebug>
#include <QCoreApplication>
#include <QKeyEvent>
#include <QApplication>class custom_button : public QPushButton
{Q_OBJECT
public:explicit custom_button(QWidget *parent = nullptr);private slots:void func();
};#endif // CUSTOM_BUTTON_H// custom_button.cpp
#include "custom_button.h"custom_button::custom_button(QWidget *parent) : QPushButton(parent)
{qDebug()<<"custom_button 构造";connect(this, &QPushButton::clicked, this, &custom_button::func);
//    connect(this, SIGNAL(clicked()), this, SLOT(func()));
}void custom_button::func()
{//获取信号的发送者QPushButton *p=qobject_cast<QPushButton *>(sender());QString str=p->text(); // 获取按钮的字面值
#if 0if (!str.isEmpty()) {QChar ch = str.at(0);int key = ch.toUpper().unicode(); // 获取大写字符的键值QKeyEvent *keyevent = new QKeyEvent(QEvent::KeyPress,key,Qt::NoModifier,QString(ch));QCoreApplication::postEvent(QApplication::focusWidget(), keyevent);}
#else//按照事件产生的流程写代码//自定义一个按键事件QKeyEvent *keyevent=new QKeyEvent(QEvent::KeyPress,str.toInt() - 32,Qt::NoModifier,str);//把这个按键事件发送出去--》发送给鼠标光标聚集的组件QCoreApplication::postEvent(QApplication::focusWidget(),keyevent);
#endif
}

现象:

请添加图片描述

示例代码2:按键事件实现软键盘(加特殊按键)

与示例代码1的差别是在槽函数中增加了特殊按键的判断


// custom_button.h
#ifndef CUSTOM_BUTTON_H
#define CUSTOM_BUTTON_H#include <QPushButton>
#include <QDebug>
#include <QCoreApplication>
#include <QKeyEvent>
#include <QApplication>class custom_button : public QPushButton
{Q_OBJECT
public:explicit custom_button(QWidget *parent = nullptr);private slots:void func();
};#endif // CUSTOM_BUTTON_H// custom_button.cpp
#include "custom_button.h"custom_button::custom_button(QWidget *parent) : QPushButton(parent)
{qDebug()<<"custom_button 构造";connect(this, &QPushButton::clicked, this, &custom_button::func);
//    connect(this, SIGNAL(clicked()), this, SLOT(func()));
}void custom_button::func()
{//获取信号的发送者QPushButton *p=qobject_cast<QPushButton *>(sender());QString str=p->text(); // 获取按钮的字面值
#if 0if (!str.isEmpty()) {QChar ch = str.at(0);int key = ch.toUpper().unicode(); // 获取大写字符的键值QKeyEvent *keyevent = new QKeyEvent(QEvent::KeyPress,key,Qt::NoModifier,QString(ch));QCoreApplication::postEvent(QApplication::focusWidget(), keyevent);}
#else//按照事件产生的流程写代码QKeyEvent *keyevent;//判断特殊按键if(str=="Backspace") //退格键{//自定义一个按键事件keyevent=new QKeyEvent(QEvent::KeyPress,Qt::Key_Backspace,Qt::NoModifier,str);}else if(str=="Enter"){//自定义一个按键事件keyevent=new QKeyEvent(QEvent::KeyPress,Qt::Key_Enter,Qt::NoModifier,str);}else if(str==""){//自定义一个按键事件keyevent=new QKeyEvent(QEvent::KeyPress,Qt::Key_Space,Qt::NoModifier," ");}else //字母按键{//自定义一个按键事件keyevent=new QKeyEvent(QEvent::KeyPress,str.toInt()-32,Qt::NoModifier,str);}//把这个按键事件发送出去--》发送给鼠标光标聚集的组件QCoreApplication::postEvent(QApplication::focusWidget(),keyevent);
#endif
}

现象:

请添加图片描述

软键盘移植到新的工程的步骤:

1.将已实现的功能代码copy到新工程目录下
在这里插入图片描述
2.在工程文件名下右键—》添加现有文件
在这里插入图片描述
3.选择第一步copy过去的文件进行添加

在这里插入图片描述4.在新工程中设计界面,将widget类提升为自定义的软键盘类

在这里插入图片描述

5.编译后即可使用
请添加图片描述

自定义软键盘设计步骤:图示

1.先在主窗口设计好界面,此时可以看到widget的类为QWidget(这个widget就是用来存放软件的)
在这里插入图片描述

2.新建一个UI界面用来设计软键盘(添加新的设计师界面类)
在这里插入图片描述
3.右键widget控件,选择提升为…,将该widget提升为上一步自定义的软键盘界面类

在这里插入图片描述
4.填写提升的类名称,如下
在这里插入图片描述
5.此时可以看到已将widget提升为自定义的软键盘类
在这里插入图片描述
7.编译后也可以看到已经显示到主窗口
在这里插入图片描述
7.新建一个C++类,使其继承自QPushButton (用来实现软键盘的功能)

在这里插入图片描述
8.将软键盘界面的按钮类提升为新建的C++类,此时该软键盘界面使用的就是该类写好的功能
在这里插入图片描述
9.将焦点策略改为不聚焦,这样在点击按钮时,此时的焦点就不是是按钮,而是单行输入框,这样就可以根据新建的C++类写好的事件进行处理
在这里插入图片描述
9.在新建的custom_button类(这里是上边提到的新建的C++类)中关联信号与槽函数,在槽函数中实现按键的逻辑

#include "custom_button.h"custom_button::custom_button(QWidget *parent) : QPushButton(parent)
{qDebug()<<"custom_button 构造";connect(this, &QPushButton::clicked, this, &custom_button::func);
//    connect(this, SIGNAL(clicked()), this, SLOT(func()));
}void custom_button::func()
{//获取信号的发送者QPushButton *p=qobject_cast<QPushButton *>(sender());QString str=p->text(); // 获取按钮的字面值qDebug()<<"str.toInt():"<<str.toInt();//按照事件产生的流程写代码//自定义一个按键事件  str.toInt()-32 :输入按钮字面值的ASCII 值 -32 如输入a:即键值是97-32QKeyEvent *keyevent=new QKeyEvent(QEvent::KeyPress,str.toInt() - 32,Qt::NoModifier,str);//把这个按键事件发送出去--》发送个鼠标光标聚集的组件QCoreApplication::postEvent(QApplication::focusWidget(),keyevent);
}

11.现象如下
请添加图片描述

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

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

相关文章

【LaTeX+VSCode本地Win11编译教程】

LaTeXVSCode本地编译教程参考视频&#xff1a; LaTeXVSCode本地编译教程 下面提供一种Win11的Latex环境配置和设置方案&#xff0c;首先vscode安装参考博客&#xff1a;【VscodeGit教程】&#xff0c;然后准备安装Latex相关组件 在 https://miktex.org/download 下载 miktex 并…

2025五一杯数学建模ABC题赛题已出

2025五一杯数学建模ABC题赛题已出 A: B: C:

Springclound常用五大组件及其使用原理

注册中心Eureka Eureka-Server&#xff1a;就是服务注册中心&#xff08;可以是一个集群&#xff09;&#xff0c;对外暴露自己的地址。 提供者&#xff1a;启动后向Eureka注册自己信息&#xff08;地址&#xff0c;服务名称等&#xff09;&#xff0c;并且定期进行服务续约 …

Docker —— 隔离的基本操作(2)

Docker —— 隔离的基本操作&#xff08;2&#xff09; unshareunshare 命令详解基本语法常用选项常用示例实际应用场景注意事项与 Docker 的关系1. 执行命令2. 修改主机名3. 退出命名空间4. 验证宿主机主机名关键原理类比 Docker 容器总结 实战操作一&#xff08;PID 隔离&…

Java List分页工具

PageUtil.java import com.google.common.collect.Lists; import com.jd.platform.hotkey.dashboard.common.domain.Page; import org.springframework.util.CollectionUtils;import java.util.ArrayList; import java.util.List;public class PageUtil {/*** 通用分页工具类*…

中阳策略:如何从K线行为中提取交易逻辑信号?

中阳策略&#xff1a;如何从K线行为中提取交易逻辑信号&#xff1f; 在量化趋势研究中&#xff0c;中阳形态常被视作市场动能变化的重要标志。它不仅代表价格的强势上行&#xff0c;更隐含着主力资金换手与情绪转换的信号。将“中阳”这一结构元素抽象为模型中的“强动能突破”…

Java SE(8)——继承

1.继承的概念&作用 在Java中&#xff0c;继承是面向对象编程的三大基本特性之一&#xff08;还有封装和多态&#xff09;&#xff0c;允许一个类&#xff08;子类/继承类&#xff09;继承另一个类&#xff08;父类/基类&#xff09;的属性和方法 继承的核心目的是&#xf…

Python爬虫(18)反爬攻防战:动态IP池构建与代理IP实战指南(突破95%反爬封禁率)

目录 引言一、背景&#xff1a;为什么代理IP是爬虫的“第二生命”&#xff1f;1.1 反爬系统的IP检测三把刀1.2 代理IP的核心价值 二、基础实战&#xff1a;快速搭建代理IP系统2.1 免费代理IP的获取与筛选2.2 代理IP的智能容错机制 三、高阶攻防&#xff1a;突破企业级反爬封锁3…

LFU算法解析

文章目录 LFU缓存中关键变量的访问与更新机制1. min_freq - 最小频率访问时机更新时机更新示例 2. capacity - 缓存容量访问时机更新时机访问示例 3. key_to_node - 键到节点的映射访问时机更新时机更新示例 4. freq_to_dummy - 频率到链表哑节点的映射访问时机更新时机更新示例…

ByteArrayInputStream 类详解

ByteArrayInputStream 类详解 ByteArrayInputStream 是 Java 中用于从字节数组读取数据的输入流&#xff0c;位于 java.io 包。它允许将内存中的字节数组当作输入流来读取&#xff0c;是处理内存数据的常用工具。 1. 核心特性 内存数据源&#xff1a;从字节数组&#xff08;b…

rvalue引用()

一、先确定基础:左值(Lvalue)和右值(Rvalue) 理解Rvalue引用,首先得搞清楚左值和右值的概念。 左值(Lvalue):有明确内存地址的表达式,可以取地址。比如变量名、引用等。 复制代码 int a = 10; // a是左值 int& ref = a; // ref也是左值右值(Rval…

吴恩达深度学习作业 RNN模型——字母级语言模型

一. 简单复习一下RNN RNN RNN适用于处理序列数据&#xff0c;令是序列的第i个元素&#xff0c;那么就是一个长度为的序列&#xff0c;NLP中最常见的元素是单词&#xff0c;对应的序列是句子。 RNN使用同一个神经网络处理序列中的每一个元素。同时&#xff0c;为了表示序列的…

基于python的哈希查表搜索特定文件

Python有hashlib库&#xff0c;支持多种哈希算法&#xff0c;比如MD5、SHA1、SHA256等。通常SHA256比较安全&#xff0c;但MD5更快&#xff0c;但可能存在碰撞风险&#xff0c;得根据自己需求决定。下面以SHA256做例。 import hashlib import os from typing import Dict, Lis…

idea创建springboot项目无法创建jdk8原因及多种解决方案

idea创建springboot项目无法创建jdk8原因及多种解决方案 提示&#xff1a;帮帮志会陆续更新非常多的IT技术知识&#xff0c;希望分享的内容对您有用。本章分享的是springboot的使用。前后每一小节的内容是存在的有&#xff1a;学习and理解的关联性。【帮帮志系列文章】&#x…

【C++进阶十】多态深度剖析

【C进阶十】多态深度剖析 1.多态的概念及条件2.虚函数的重写3.重写、重定义、重载区别4.C11新增的override 和final5.抽象类6.虚表指针和虚表6.1什么是虚表指针6.2指向谁调用谁&#xff0c;传父类调用父类&#xff0c;传子类调用子类 7.多态的原理8.单继承的虚表状态9.多继承的…

面向网络安全的开源 大模型-Foundation-Sec-8B

1. Foundation-Sec-8B 整体介绍 Foundation-Sec-8B 是一个专注于网络安全领域的大型语言模型 (LLM),由思科的基础人工智能团队 (Foundation AI) 开发 。它基于 Llama 3.1-8B 架构构建,并通过在一个精心策划和整理的网络安全专业语料库上进行持续预训练而得到增强 。该模型旨在…

Python爬虫的基础用法

Python爬虫的基础用法 python爬虫一般通过第三方库进行完成 导入第三方库&#xff08;如import requests &#xff09; requests用于处理http协议请求的第三方库,用python解释器中查看是否有这个库&#xff0c;没有点击安装获取网站url&#xff08;url一定要解析正确&#xf…

WHAT - Tailwind CSS + Antd = MetisUI组件库

文章目录 Tailwind 和 Antd 组件库MetisUI 组件库 Tailwind 和 Antd 组件库 在 WHAT - Tailwind 样式方案&#xff08;不写任何自定义样式&#xff09; 中我们介绍了 Tailwind&#xff0c;至于 Antd 组件库&#xff0c;我们应该都耳熟能详&#xff0c;官网地址&#xff1a;htt…

Day 4:牛客周赛Round 91

好久没写了&#xff0c;问题还蛮多的。听说这次是苯环哥哥出题 F题 小苯的因子查询 思路 考虑求因子个数&#xff0c;用质因数分解&#xff1b;奇数因子只需要去掉质数为2的情况&#xff0c;用除法。 这里有个比较妙的细节是&#xff0c;提前处理出数字x的最小质因数&#xff0…

使用直觉理解不等式

问题是这个&#xff1a; 题目 探究 ∣ max ⁡ b { q 1 ( z , b ) } − max ⁡ b { q 2 ( z , b ) } ∣ ≤ max ⁡ b ∣ q 1 ( z , b ) − q 2 ( z , b ) ∣ |\max_b\{q_1(z,b)\}-\max_b\{q_2(z,b)\}|\le\max_b|q_1(z,b)-q_2(z,b)| ∣maxb​{q1​(z,b)}−maxb​{q2​(z,b)}∣≤…