QT自定义空间之软键盘

news2025/2/28 21:35:51

QT自定义空间之软键盘

  • 1.功能列表
  • 2.效果
    • 2.1 中文键盘&汉字输入
    • 2.2 英文输入法
    • 2.3 数字键盘
    • 2.4 数据键盘效果
  • 3.部分代码
    • 3.1 汉字输入
    • 3.2 切换数字键盘
    • 3.3 键盘显示&隐藏
    • 3.4 控件提升
    • 3.5样式设置
    • 3.6 使用QLineEditAllKeyBoard 控件

1.功能列表

  • 支持中文输入法
  • 支持引文输入
  • 支持数字键盘
  • 支持中文/英文/数字软键盘切换

2.效果

2.1 中文键盘&汉字输入

在这里插入图片描述

2.2 英文输入法

在这里插入图片描述

2.3 数字键盘

在这里插入图片描述

2.4 数据键盘效果

在这里插入图片描述

3.部分代码

3.1 汉字输入

基于googlepingyin输入

void KeyboardForm::displayHanzi()
{
    if (m_hanziPageCnt <= 0)
    {
        m_listHanzi[0]->setEnabled(false);
        m_listHanzi[hanziCandidate-1]->setEnabled(false);
        for (int i = 0; i < hanziCandidate-2; i++)
        {
            m_listHanzi[i+1]->setText("");
            m_listHanzi[i+1]->setEnabled(false);
        }
    }
    else if (m_hanziPageCnt == 1)
    {
        m_listHanzi[0]->setEnabled(false);
        m_listHanzi[hanziCandidate-1]->setEnabled(false);
        int len = m_pinyin.HanziModel.size();
        for (int i = 0; i < len; i++)
        {
            m_listHanzi[i+1]->setText(m_pinyin.HanziModel[i]);
            m_listHanzi[i+1]->setEnabled(true);
        }
        for (int i = len; i < hanziCandidate-2; i++)
        {
            m_listHanzi[i+1]->setText("");
            m_listHanzi[i+1]->setEnabled(false);
        }
    }
    else if (m_curHanziPage == 1)
    {
        m_listHanzi[0]->setEnabled(false);
        m_listHanzi[hanziCandidate-1]->setEnabled(true);
        for (int i = 0; i < hanziCandidate-2; i++)
        {
            m_listHanzi[i+1]->hide();
            m_listHanzi[i+1]->setText(m_pinyin.HanziModel[i]);
            m_listHanzi[i+1]->setEnabled(true);
            m_listHanzi[i+1]->show();
        }
    }
    else if (m_curHanziPage == m_hanziPageCnt)
    {
        m_listHanzi[0]->setEnabled(true);
        m_listHanzi[hanziCandidate-1]->setEnabled(false);
        qDebug() << m_pinyin.HanziModel << m_pinyin.HanziModel.size();
        int len = m_pinyin.HanziModel.size() % (hanziCandidate-2);
        int idx = (m_hanziPageCnt - 1) * (hanziCandidate-2);
        if (len == 0)
        {
            len = hanziCandidate-2;
        }

        for (int i = 0; i < len; i++)
        {
            m_listHanzi[i+1]->setText(m_pinyin.HanziModel[idx + i]);
            m_listHanzi[i+1]->setEnabled(true);
        }
        for (int i = len; i < hanziCandidate-2; i++)
        {
            m_listHanzi[i+1]->setText("");
            m_listHanzi[i+1]->setEnabled(false);
        }
    }
    else
    {
        m_listHanzi[0]->setEnabled(true);
        m_listHanzi[hanziCandidate-1]->setEnabled(true);
        int idx = (m_curHanziPage - 1) * (hanziCandidate-2);
        for (int i = 0; i < hanziCandidate-2; i++)
        {
            m_listHanzi[i+1]->setText(m_pinyin.HanziModel[idx + i]);
            m_listHanzi[i+1]->setEnabled(true);
        }
    }
}

3.2 切换数字键盘

void KeyboardForm::changeSymbol()
{
    if (m_btnSymbol->text() == ".?123")
    {
        m_btnSymbol->setText("返回");

        // 输出已有的字母
        sendKeyToFocusItem(m_cachePinYin);

        m_hanziPageCnt = 0;
        m_labPyText->clear();
        m_cachePinYin.clear();
        displayHanzi();

        m_shiftKey = false;
        m_inputMode = ImNum;
        m_btnChange->setIconSize(QSize(0,0));
        m_btnChange->setText("数字");
        for (int i = 0; i < m_listCharsBtns.size(); i++)
        {
            m_listCharsBtns[i]->setText(kbSymbol[i] == '&' ? "&&" : QString(QLatin1Char(kbSymbol[i])));
        }
    }
    else
    {
        m_btnSymbol->setText(".?123");
        m_inputMode = (InputMode)m_btnChange->property("Mode").toInt();

        QIcon btn_icon;
        btn_icon.addFile(m_inputMode == ImCn ? ":/image/chinese.png":":/image/english.png");
        m_btnChange->setIcon(btn_icon);
        m_btnChange->setIconSize(QSize(70, 70));
        m_btnChange->setText("");
//        m_btnChange->setText(m_inputMode == ImCn ? "中/英" : "中/英");
        for (int i = 0; i < m_listCharsBtns.size(); i++)
        {
            m_listCharsBtns[i]->setText(QString(QLatin1Char(kbLetter[i])));
        }
    }
}

3.3 键盘显示&隐藏

显示键盘输入法

void InputContext::showInputPanel()
{
    if (!d->KeyBoard)
    {
        d->KeyBoard = new KeyboardForm();
        connect(d->KeyBoard, SIGNAL(sendKeyToFocusItem(QString)), &d->keyEventDispatcher, SLOT(sendKeyToFocusItem(QString)));
    }
    d->KeyBoard->show();
    d->KeyBoard->move(d->KeyBoard->x(), WINDOW_HEIGHT - d->KeyBoard->height());

    QPlatformInputContext::showInputPanel();
}

隐藏键盘输入法

void InputContext::hideInputPanel()
{
    if (d->KeyBoard)
    {
        d->KeyBoard->hide();
    }

    QPlatformInputContext::hideInputPanel();
}

3.4 控件提升

重写QLineEdit控件

class QLineEditAllKeyBoard : public QLineEdit
{
    Q_OBJECT
public:
    explicit QLineEditAllKeyBoard(QWidget *parent = nullptr);

private:
    InputContext *pInputContext;
signals:

public slots:
protected:
    virtual void mousePressEvent(QMouseEvent *event);
};

3.5样式设置

设置整体样式,包含按钮,面板

    setStyleSheet("QWidget{background:#191919;color:#FFFFFF;}"
                  "QPushButton{background-color: #313131; border-width: 5; font: normal;border:1px #313131;color:#FFFFFF;border-radius:1px;padding:1px 2px;} "
                  "QPushButton:hover{background-color: #00B2DB; border-width: 5;}"
                  "QPushButton:pressed{background-color: #00B2DB; border-width: 5;}");

3.6 使用QLineEditAllKeyBoard 控件

提升UI中的QLineEdit控件为QLineEditAllKeyBoard
在这里插入图片描述

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

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

相关文章

jdk7新增时间类Date,SimpleDateFormat,Calendar

Date //需求1 打印时间远点开始一年后的时间extracted();//需求2 定义任意两个date对象 比较那个时间在前 哪个在后Random rnew Random();Date date1new Date(Math.abs(r.nextInt()));Date date2new Date(Math.abs(r.nextInt()));System.out.println(date1);System.out.printl…

在迪拜举行的 GITEX GLOBAL 2023 IT 展览会上,Positive Technologies 荣获两项大奖!

&#x1f3c6; 在迪拜举行的 GITEX GLOBAL 2023 IT 展览会上&#xff0c;Positive Technologies 荣获两项大奖。这两个奖项都是影响力网络安全领域的最佳供应商。 &#x1f3f5; Future Enterprise Awards 2023 是该地区 IT 行业最重要的奖项之一。该奖项每年颁发给对信息技术…

python---三目运算符

在Python中三目运算符也叫三元运算符&#xff0c;其主要作用&#xff1a;就是用于 简化if...else...语句。 基本语法&#xff1a; 原 if 条件判断: # 语句段1 else: # 语句段2 新-----三目运算符/三元运算符 语句段1 if 条件判断 else 语句段2 案例 输入两个数…

网站如何优化加速,让网站降低延迟

优化网站架构 精简页面加载过程&#xff1a;通过消除冗余代码和不必要的图像&#xff0c;并采用CDN资源分发&#xff0c;以减少加载时间。 精心规划内容架构&#xff1a;通过使用恰当的标题和描述&#xff0c;使搜索引擎能够快速理解页面的内涵。 选择性能出众的前端框架&…

【QT】常用控件——按钮组

继承Widget PushButton 设置图片&#xff0c;先导入图片资源&#xff0c;见&#xff1a;【QT】资源文件导入_复制其他项目中的文件到qt项目中_StudyWinter的博客-CSDN博客 在布局中添加图片 调整尺寸 toolButton 显示图片、文本 显示图片&#xff08;图片和文字都有时&#…

git学习——第5节 远程仓库

自行设置&#xff1a;远程仓库 - 廖雪峰的官方网站 (liaoxuefeng.com) 添加远程库 现在的情景是&#xff0c;你已经在本地创建了一个Git仓库后&#xff0c;又想在GitHub创建一个Git仓库&#xff0c;并且让这两个仓库进行远程同步&#xff0c;这样&#xff0c;GitHub上的仓库既…

排查手机应用app微信登录问题不跳转失败原因汇总及其解决方案

经过最近我发的文章,我个人觉得解决了不少小问题,因为最近很小白的问题已经没有人私聊问我了,我总结了一下排查手机应用app微信登录问题不跳转失败的原因汇总及其解决方案在这篇文章中,分析微信登录不跳转的原因,并提供解决方案。希望通过这篇文章,能够帮助大家顺利解决这…

Python Connect SQLServer 2008

Macos&#xff08;经过了两天&#xff0c;无数次的方法验证&#xff0c;寻找各种资料&#xff0c;总结如下&#xff09; brew install freetds0.91 如果出现错误就进行手工安装 brew install freedts0.91 出错。 linqllinqldeMBP-2 / % brew install freetds0.91 Warning: No …

css-水滴登录页

效果图&#xff1a; html <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><link type"text/css" rel"stylesheet" href"login.css" /></head><body><…

从零开始的C语言学习第十九课:C语言内存函数

目录 1. memcpy使用和模拟实现 2. memmove使用和模拟实现 3. memset函数的使用 4. memcmp函数的使用 1. memcpy使用和模拟实现 void * memcpy ( void * destination, const void * source, size_t num ); 函数memcpy从source的位置开始向后复制num个字节的数据到destinati…

sylar高性能服务器-配置(P9)代码解析+调试分析

文章目录 一、代码解析1.1配置基类(ConfigVarBase)1.2配置参数类(ConfigVar)1.3配置管理类(Config) 二、代码调试2.1SYLAR_LOG_INFO(SYLAR_LOG_ROOT())2.2ConfigVart调试 本节内容主要讲诉了sylar高性能服务器视频P9的内容&#xff0c;并给出了代码逐步调试的步骤和结果。本节内…

Linux块设备缓存Bcache使用

1 Bcache简介 Bcache是Linux内核块层cache&#xff0c;它使用SSD来作为HDD硬盘的cache&#xff0c;从而起到加速作用。Bcache内核模块仅在Linux 3.10及以上版本支持&#xff0c;因此使用Bcache&#xff0c;需要将内核升级到3.10及以上版本&#xff0c;并在内核配置项中打开Bca…

vue3后台管理系统之layout组件的搭建

1.1静态布局 <template><div class"layout_container"><!-- 左侧导航 --><div class"layout_slider"></div><!-- 顶部导航 --><div class"layout_tabbar"></div><!-- 内容展示区 --><…

【Linux】Ubuntu存储分析

文章目录 前言1 如何对系统进行存储分析2 如果出现存储空间不足的警告应该怎么办&#xff1f;3 存储空间太小导致不能开机怎么办&#xff1f;4 如何对系统进行扩容 前言 因为要编译一个ARM架构的Linux SDK&#xff0c;结果没想到这个SDK解压编译完大小远超我想象&#xff0c;直…

【算法|前缀和系列No.5】leetcode1314. 矩阵区域和

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【Leetcode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

【茫茫架构路】1. Class File字节码文件解析

本文所有内容的JDK版本为 OpenJDK 11 JDK11 Class File官方说明。 Java解析字节码文件源码参考&#xff0c;以下为部分字节码解析源码展示。 public ClassFile(DataInputStream in) {try {//magic: 0xCAFEBABEthis.magic ClassReader.readInt(in);System.out.println("m…

Vue 异步更新 -- $nextTick

Vue 异步更新 – $nextTick **创建 工程&#xff1a; H:\java_work\java_springboot\vue_study ctrl按住不放 右键 悬着 powershell H:\java_work\java_springboot\js_study\Vue2_3入门到实战-配套资料\01-随堂代码素材\day04\准备代码\16-$nextTick vue --version vue crea…

Spring(四)

1、Spring6整合JUnit 1、JUnit4 User类: package com.songzhishu.spring.bean;import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component;/*** BelongsProject: Spring6* BelongsPackage: com.songzhishu.spring.bean*…

UI自动化测试的痛点

当我们找工作的时候查看招聘信息发现都需要有自动化测试经验&#xff0c;由此看来测试人员不会一点自动化测试技术都不好意思说自己是做软件测试的。大部分测试人员也都是从使用自动化测试工具、录制回放、测试脚本、开发小工具入门自动化测试的&#xff0c;然后在慢慢的接触 U…

微信隐秘功能:如何巧妙隐藏好友和消息的方法教程

在日常使用微信的过程中&#xff0c;难免会有些私密内容或特定的联系人和群聊希望能够暂时隐藏起来&#xff0c;以保护个人隐私。幸运的是&#xff0c;微信提供了一些内置功能以及额外的工具&#xff0c;能够帮助我们实现这一目的。下面就来详细介绍一种简单易行的方法&#xf…