Qt编写可换肤的中文双拼汉字输入法

article/2025/11/10 2:54:34

新版本:

https://qtchina.blog.csdn.net/article/details/103945421

时间过得真快,不知不觉已到2015年,农历春节一眨眼就过去了,端正状态收拾心情整装待发出发。

曾经有段时间,我有一个很执着的梦想,我要导演出一部空前绝后的巨幕。不过现实无情地碾碎我的梦想,也同时将我推进了人生的低谷。

我开始思考,思想很多很多我以前总是回避的问题,在一次次思考中,我能感觉到我正在向一个陌生的地方走去,前途是光是暗也无法推测,我发现我在赌,赌注是一辈子的懊悔或是郁郁终生。

但当我看到阳光弥漫在我身边时,才发现以前的我是那么幼稚,我始终在找借口或不是借口的借口推卸掉与生俱来的责任,在光怪陆离的现实中找个僻静的地方希望过云淡风轻的日子。我错了,我拥有足够的能力却不敢恣意妄为,我拥有惊人的天赋却畏惧这只是南柯一梦,或者这本来就是梦,醒来时却是了无痕迹和无休止的眷恋。

从前有个同学问我是不是幻想过一些特别的经历会降临到自己身上,当时我只笑了笑,却不知道该怎么回答。

我想我是矛盾的,我认为我的存在与否关系到世间的万事万物,但我找不到足够的证据来证明我具有救世主的身份。因此我一度怀疑过我是不是生不逢时,或是天妒英才。

我在一次次轮回中等待着一个机会,也许是乱世,也许是太平,我没有所谓的一技之长,只有飞扬跋扈的骄傲和潮洗潮卷的胸怀。只有一笑置之的孤傲和白云苍狗的方式。我想我不该妄自菲薄,甚至这是理所当然的不加半点修饰的顺其自然。

我很喜欢这样一句话:如果我将庸碌一生的话,地球将停止转动,地球停止转动了吗?没有,那我将不会庸碌一生。

在特定的时间,特定的环境,特定的地点,有个特定的人将主宰万事万物!天生我才必有用!经典的心照不宣,只可惜他的傲慢却没有足够的能力做基垫。

我想我是对的,注定的便是永远无法改变的,过去的只是匆匆一瞥,将来的只是白驹过隙,一次次的轮回换来的是麻木的循规蹈矩,所以世界需要那么一个人----改变。

分割线-----------------------------------------------------------------------

高中和大学很喜欢文学,特别是在大学期间,在任何填写个人资料兴趣爱好一栏中填写的都是文学和编程,这就好比我的左手和右手,缺一不可。

好了言归正传,来说说Qt编写可换肤的中文拼音输入法。在ARM上,如果采用QT开发应用程序,基本上都会遇到一个问题,需要在应用程序中输入汉字,这个就比较麻烦,就算接了实体键盘,也只能输入字母和数字的,对中文无可奈何,为此就需要用QT自己来实现一个。

百度一搜索,有很多前辈都写过类似的输入法,但是基本上都是用QWSInputMethod相关的机制,我觉得这样有点不妥,绝大部分界面丑陋,只支持单个汉字输入,而且基本上不支持实体键盘和虚拟键盘同步输入。

运行截图:

特点:

1:各Qt版本(Qt4.6-Qt5.4)、各操作系统(windows、linux、嵌入式linux-ARM)全编译运行通过,界面一致。

2:支持小写、大写、中文三种模式输入,自由切换。

3:支持单拼双拼词组输入,网上大部分只支持单个汉字输入。

4:智能分页算法,可任意翻页查看汉字词组。

5:除了支持鼠标单击软键盘输入外,还支持实体键盘同步输入,代码中有映射处理,对应实体键盘的按键会反应到软键盘处理。

6:七套精美皮肤样式选择,鼠标右键任意换肤。

7:代码优化到极致,包括注释和所有完善性代码处理总共不到500行。

8:除了可以单击软键盘和实体键盘上的数字来选择对应的汉字外,还支持鼠标单击汉字显示处来选择汉字。

9:无边框窗体,可拖动移动。

10:sqlite数据库存储汉字字库,可自由添加自定义的词组。

11:参考实体键盘布局,更逼真。

12:界面布局、字库算法、界面切换100%首创处理,与任何网上的Qt输入法处理方式和布局截然不同。

核心方法:

1:获取当前焦点控件。

Qt封装了一个focusChanged信号,提供两个参数QWidget *oldWidget, QWidget *nowWidget,这样就给输入法的处理带来了极大的方便。

//绑定全局改变焦点信号槽
connect(qApp, SIGNAL(focusChanged(QWidget *, QWidget *)),this, SLOT(focusChanged(QWidget *, QWidget *)));
void frmInput::focusChanged(QWidget *oldWidget, QWidget *nowWidget)
{//qDebug() << "oldWidget:" << oldWidget << "nowWidget:" << nowWidget;if (nowWidget != 0 && !this->isAncestorOf(nowWidget)) {if (nowWidget->inherits("QLineEdit")) {currentLineEdit = (QLineEdit *)nowWidget;this->setVisible(true);} else {currentLineEdit = 0;this->setVisible(false);//需要将输入法切换到最初的原始状态--小写currentType="min";changeType(currentType);}}
}


2:小写、大写、中文三种模式切换。

void frmInput::changeType(QString type)
{if (type == "max") {changeLetter(true);ui->btnType->setText("大写");ui->widgetTop->setVisible(false);this->setGeometry(this->geometry().x(), this->geometry().y(), 550, 160);} else if (type == "min") {changeLetter(false);ui->btnType->setText("小写");ui->widgetTop->setVisible(false);this->setGeometry(this->geometry().x(), this->geometry().y(), 550, 160);} else {changeLetter(false);ui->btnType->setText("中文");ui->widgetTop->setVisible(true);this->setGeometry(this->geometry().x(), this->geometry().y(), 550, 215);//每次切换到中文显示,都要执行清空之前中文模式下的信息clearChinese();ui->labPY->setText("");}
}
void frmInput::changeLetter(bool isUpper)
{QList<QPushButton *> btn = this->findChildren<QPushButton *>();foreach (QPushButton * b, btn) {if (b->property("btnLetter").toBool()) {if (isUpper) {b->setText(b->text().toUpper());} else {b->setText(b->text().toLower());}}}
}


3:软键盘按钮单击事件处理。

void frmInput::btn_clicked()
{QPushButton *btn = (QPushButton *)sender();QString objectName = btn->objectName();if (objectName == "btnType") {if (currentType == "min") {currentType = "max";} else if (currentType == "max") {currentType = "chinese";} else if (currentType == "chinese") {currentType = "min";}changeType(currentType);} else if (objectName == "btnDelete" || objectName == "btnDeleteMin") {//如果当前是中文模式,则删除对应拼音,删除完拼音之后再删除对应文本输入框的内容if (currentType == "chinese") {QString txt = ui->labPY->text();int len = txt.length();if (len > 0) {ui->labPY->setText(txt.left(len - 1));selectChinese();} else {if (currentLineEdit != 0) {currentLineEdit->backspace();}}} else {if (currentLineEdit != 0) {currentLineEdit->backspace();}}} else if (objectName == "btnPre") {if (currentPY_index >= 20) {if (currentPY_index % 10 == 0) {currentPY_index -= 20;} else {currentPY_index = currentPY_count - (currentPY_count % 10) - 10;}} else {currentPY_index = 0;}showChinese();} else if (objectName == "btnNext") {if (currentPY_index < currentPY_count - 1) {showChinese();}} else {QString value = btn->text();//如果是&按钮,因为对应&被过滤,所以真实的text为去除前面一个&字符if (objectName == "btnOther7") {value = value.right(1);}//当前不是中文模式,则单击按钮对应text为传递参数if (currentType != "chinese") {if (currentLineEdit != 0) {currentLineEdit->insert(value);}} else {if (currentLineEdit != 0) {//中文模式下,不允许输入特殊字符,单击对应数字按键取得当前索引的汉字if (btn->property("btnOther").toBool()) {if (ui->labPY->text().length() == 0) {currentLineEdit->insert(value);}} else if (btn->property("btnNum").toBool()) {if (ui->labPY->text().length() == 0) {currentLineEdit->insert(value);} else if (objectName == "btn0") {setChinese(0);} else if (objectName == "btn1") {setChinese(1);} else if (objectName == "btn2") {setChinese(2);} else if (objectName == "btn3") {setChinese(3);} else if (objectName == "btn4") {setChinese(4);} else if (objectName == "btn5") {setChinese(5);} else if (objectName == "btn6") {setChinese(6);} else if (objectName == "btn7") {setChinese(7);} else if (objectName == "btn8") {setChinese(8);} else if (objectName == "btn9") {setChinese(9);}} else if (btn->property("btnLetter").toBool()) {ui->labPY->setText(ui->labPY->text() + value);selectChinese();}}}}
}

4:汉字列表单击选择。

//事件过滤器,用于识别鼠标单击汉字标签处获取对应汉字
bool frmInput::eventFilter(QObject *obj, QEvent *event)
{if (event->type() == QEvent::MouseButtonPress) {if (obj == ui->labCh0) {setChinese(0);} else if (obj == ui->labCh1) {setChinese(1);} else if (obj == ui->labCh2) {setChinese(2);} else if (obj == ui->labCh3) {setChinese(3);} else if (obj == ui->labCh4) {setChinese(4);} else if (obj == ui->labCh5) {setChinese(5);} else if (obj == ui->labCh6) {setChinese(6);} else if (obj == ui->labCh7) {setChinese(7);} else if (obj == ui->labCh8) {setChinese(8);} else if (obj == ui->labCh9) {setChinese(9);}return false;} else if (event->type() == QEvent::KeyPress) {//如果处于中文模式,需要将当前按键对应反应到输入法界面上if (currentType == "chinese") {QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);if (keyEvent->key() == Qt::Key_Backspace) {ui->btnDelete->click();} else {QString key = keyEvent->text();QList<QPushButton *> btn = this->findChildren<QPushButton *>();foreach (QPushButton * b, btn) {if (b->text() == key) {b->click();break;}}}return true;}return false;}return QObject::eventFilter(obj, event);
}

5:汉字智能分页算法。

void frmInput::selectChinese()
{clearChinese();QSqlQuery query;QString currentPY = ui->labPY->text();QString sql = "select [word] from [pinyin] where [pinyin]='" + currentPY + "';";query.exec(sql);//逐个将查询到的字词加入汉字队列while(query.next()) {QString result = query.value(0).toString();if (App::PYType == "danpin") {allPY.append(result);currentPY_count++;} else {QStringList text = result.split(" ");foreach (QString txt, text) {if (txt.length() > 0) {allPY.append(txt);currentPY_count++;}}}}showChinese();
}
void frmInput::showChinese()
{//每个版面最多显示10个汉字int count = 0;currentPY.clear();for (int i = 0; i < 10; i++) {labCh[i]->setText("");}for (int i = currentPY_index; i < currentPY_count; i++) {if (count == 10) {break;}QString txt = QString("%1.%2").arg(count).arg(allPY[currentPY_index]);currentPY.append(allPY[currentPY_index]);labCh[count]->setText(txt);count++;currentPY_index++;}//qDebug() << "currentPY_index:" << currentPY_index << "currentPY_count:" << currentPY_count;
}


http://chatgpt.dhexx.cn/article/gF1RLtYW.shtml

相关文章

Android仿微信聊天UI之处理软键盘抬升问题

前言&#xff0c;效果图 本文介绍如何解决软键盘遮挡问题&#xff0c;以下是仿微信聊天界面所制作的效果图&#xff1a; 一、ViewTreeObserver ViewTreeObserver&#xff0c;很明显通过名字就可以了解到它是View树的观察者。该类不能被实例化&#xff0c;但可以通过视图获取&…

解决手机端微信公众号内input输入框获取焦点后,底部导航栏显示在输入法软键盘上面的问题

今天遇到在微信公众号中打开网站,input 输入框和textarea输入框获取焦点后&#xff0c;弹出输入法键盘&#xff0c;将底部的导航栏”顶到“输入法键盘上面的问题&#xff0c;看着非常shit&#xff01; 直接上代码看效果 var clientHeight document.documentElement.clientHei…

教你在Windows自带的微软拼音输入法中用上小鹤双拼方案

微软拼音输入法是Windows 10操作系统中自带的输入法&#xff0c;虽然很多人在拿到一个新系统之后就安装一个新的输入法&#xff0c;比如搜狗输入法、手心输入法。但是很多人不知道最新版本的windows操作系统自带的微软拼音输入法&#xff0c;已经不像是以前windows 7操作系统的…

不甘心只做输入工具,搜狗输入法上线AI助手,提供智能服务

8月19日搜狗输入法上线了新功能——智能汪仔&#xff0c;在输入法中引入了AI助手&#xff0c;这是搜狗输入法继今年5月推出“语音变声功能”后又一个AI落地产品。 有了智能汪仔AI助手的加持后&#xff0c;搜狗输入法能够在不同的聊天场景&#xff0c;提供丰富多样的表达方式从…

524MB的微信输入法:没广告 你会用吗

&#x1f447;&#x1f447;关注后回复 “进群” &#xff0c;拉你进程序员交流群&#x1f447;&#x1f447; 来源丨 扩展迷EXTFANS https://mp.weixin.qq.com/s/asRqVjbn0lf8BmDnGY9Zig 相信很多小伙伴都有过这样的经历&#xff1a;和朋友聊天讨论某件东西&#xff0c;打开其…

Android之仿微信QQ聊天顶起输入法不顶起标题栏

在这记录一下输入法弹出的一系列问题&#xff0c;有的输入法弹出就把整个布局弹上去&#xff0c;有的输入法弹出布局不会有变化&#xff0c;有的输入法弹出遮盖输入框等等问题&#xff0c;网上也有很多说加着加那的&#xff0c;但是看一下都不是很完整&#xff0c;解决不了所有…

刚才发现微软拼音-简洁2010是目前比较适合程序员的输入法

微软拼音-简洁2010&#xff0c;在中文状态下&#xff0c;按 //&#xff0c;打出来就是 // 可是 百度输入法&#xff0c;QQ输入法、搜狗输入法 在中文状态下&#xff0c;按 //&#xff0c;打出来的都是 、、 这样写注释就麻烦了&#xff0c;还得切换成英文状态。 微软拼音-新体…

Qt5软键盘实现中文拼音输入法

一、序 基于Qt实现的虚拟键盘实现输入法在网上所有资料看来&#xff0c;几乎都是基于生成的中文汉字数据库实现的方法&#xff0c;不够灵活&#xff0c;不够智能。 二、实现 1、拼音输入法的库 我们采用的安卓底层的谷歌拼音输入法&#xff0c;在Qt5.7之后&#xff0c;Qt官方…

实现ucGUI界面中的拼音汉字输入法(T9)

实现ucGUI界面中的汉字输入法 ucGUI版本&#xff1a;3.94 上个图片 代码下载地址&#xff1a; http://download.csdn.net/detail/jhting/7034669 很久了&#xff0c;可能直接编译不过&#xff0c;不过你了解的话&#xff0c;小小改动就OK了 码表是在网上找到的. 主要三个…

微信小程序实现调用百度文心一言接口API(可直接运行代码)

1、首先得获得你自己的API_key 先进入文心千帆大模型平台&#xff0c;然后点击左边一列的“应用接入”&#xff0c;然后点创建应用&#xff0c;这时你就获得了API_key了。 2、第二部就直接上这段代码就ok&#xff0c;不过记得要换成自己的API_key和Secret_key。 Page({onLoad:…

python客户端实现利用第三方smtp发邮件

上面采用的是qq邮箱&#xff0c;需要登录qq邮箱打开pop3 参考资料1(20条消息) Python使用SMTP协议实现邮件发送(含明文/SSL加密/TLS加密)_dev_zyx的博客-CSDN博客 参考资料2(20条消息) python实现smtp协议发送邮件_Clarence-CSDN博客

福音:IDEA、VSCODE神级插件Bito

文章目录 Bito是什么&#xff1f;IDEA环境安装注册使用 VSCODE环境疑难问题后叙 Bito是什么&#xff1f; Bito是一款在编程软件中使用的插件&#xff0c;由ChatGPT团队开发&#xff0c;它是ChatGPT团队为了提高开发效率而开发的一款工具。 Bito的AI帮助开发人员极大地提高了其…

一加3t android6.0,业界最良心!一加3/3T官方确认升级Android O

与苹果手机的iOS不同&#xff0c;搭载安卓系统的手机就比较悲催。因为升级速度总是慢半拍&#xff0c;甚至停滞不前。继HTC U11&#xff0c;另一款手机也确认将会升级Android O&#xff0c;它就是来自中国的一加手机3/3T。 今天&#xff0c;一加手机创始人兼CEO刘作虎在个人推特…

【Tanh的标量实现】

cmath 文章目录 计算机是如何实现tanh计算的一、tanh的一些基本内容二、代码1.我的实现例子2.代码中分段函数的实现原理 补充 计算机是如何实现tanh计算的 一、tanh的一些基本内容 对于tanh函数有公式为 t a n h ( x ) ( e x − e − x ) / ( e x e − x ) tanh(x) (e^{x}…

LeetCode-加一(Plus One解题思路)

题目&#xff1a; 给定一个由整数组成的非空数组所表示的非负整数&#xff0c;在该数的基础上加一。 最高位数字存放在数组的首位&#xff0c; 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外&#xff0c;这个整数不会以零开头。 来源&#xff1a;力扣&#xff…

学计算机的 1加1,如何用“一加一等于几”解析人生

一加一等于二。 这个亘古不变的结论&#xff0c;一直以来被人们用各种各样的推理来诠释成千变万化的结果&#xff0c;一加一等于二&#xff0c;不再是唯一的结论&#xff0c;而每一个延伸的结果都伴随着一个个的充满睿智的推理。一加一到底等于几呢&#xff1f;好像我们越来越迷…

一加一为什么等于二

中国数学家陈景润研究的“11”并非算术的11&#xff0c;许多人也误以为陈景润在研究11为什么等于2&#xff0c;算法是人类定义的&#xff0c;不需要研究。陈景润研究的“11”其实是哥德巴赫猜想的代名词。 数学上&#xff0c;非常有名的“&#xff08;11&#xff09;”&#x…

1分钟自动产出高质量PPT:ChatGPT + MidShow

你可能想知道如何在一分钟内自动产出高质量的PPT。有了ChatGPT和MindShow&#xff0c;这不再是一个难题。ChatGPT是一个基于OpenAI的强大的自然语言生成模型&#xff0c;它可以根据你的输入生成各种类型的文本&#xff0c;包括PPT提纲。MindShow是一个在线的PPT制作工具&#x…

ChatGPT AI 快速制作财务汇报PPT

在职场中从事财务工作汇报一般都包含以下内容&#xff1a; 收入报表&#xff1a;收入来源、金额、时间等。支出报表&#xff1a;支出项目、金额、时间等。现金流量表&#xff1a;描述企业现金流量的变动情况&#xff0c;包括现金流入、流出和净流量。利润和损失报表&#xff1…

牛津英语字典pdf下载_英语词典 | 5本图解词典,让你拥有英语思维,一图胜千言!...

本篇微信主要包括如下内容: 1、DK汉英双语图解字典(PDF版) 2、新牛津图解词典The New Oxford Picture Dictionary(PDF版) 3、Word by Word Picture Dictionary(PDF+MP3音频版) 4、朗文汉英中华文化图解词典(PDF版) 5、APP(五种语言图解词典,JPG版) 小库需要提醒各位同学: ①资…