由于项目需要, 网络上关于 QT4 的键盘又不好找, 因此便自己造轮子, 造了个虚拟键盘, 先看效果图片:
ys.gif
使用过程
- ui->setupUi(this);
- vb_=new VirtualKeyBoard(this);
- vb_->setGeometry(500,0,800,400);// 高度: 宽度 2:1 好看一点
- vb_->hide();
- vb_->setAutoShow(ui->lineEdit_2);// 自定义的 lineedit
- vb_->setAutoShow(ui->textEdit);// 自定义的 textEdit
构成介绍
1, 使用 sqlite3 数据库
2,UI 设计使用的 ui 设计大师
3,keyboard.qss
4, 拼音 - 汉字数据库
期间遇到的难点
如何输入拼音, 然后得到中文词汇?
这个问题后来经高人指点, 决定使用 sqlite3 数据的模糊查找, 后来经过自己测试, 发现这个也可以实现中文词组的查找, 实现了输入法的 中文联想 功能. 主要实现代码如下:
- QMap<int, QStringList> VirtualKeyBoard::getChineseListMap(const QString &cur_text)
- {
- // QStringList chinese_list{};
- QMap<int, QStringList>list_map{};
- int page(0);
- int index(-1);// 计数是否达到最大显示数
- if(cur_text.isEmpty())
- return list_map;
- if(QSqlDatabase::contains("my_sqlite"))
- *db_ = QSqlDatabase::database("my_sqlite");
- else
- *db_ = QSqlDatabase::addDatabase("QSQLITE", "my_sqlite");
- // 打开数据库
- if(!db_->open())
- {
- qDebug()<<__func__<<db_->lastError();
- return list_map;
- }
- QString py(cur_text);
- QSqlQuery query(*db_);
- int count(0);
- if( cur_text.size()<last_py_text_.size() && !last_py_.isEmpty())// 按了退格键
- {
- last_py_.remove(last_py_.size()-3,1);
- }
- while(1)// 根据拼音获取对因汉字 / 词组
- {
- const QString command = "select PinYin, Chinese from WordAndGroup where PinYin like""'"+py+"%;'";
- if(!query.exec(command))
- {
- qDebug()<<__func__<<command<<db_->lastError();
- goto error;
- }
- while(query.next())
- {
- if(index++<MAX_VISIBLE-1)
- {
- list_map[page].append(query.value(1).toString());
- }else
- {
- page++;
- index = -1;
- }
- }
- if(list_map[page].size()>0)
- {
- last_py_=py+"%,";
- break;
- }else
- {
- QString str = last_py_;
- str.remove(QRegExp("%,"));
- if(++count==1)// 当查询不匹配时, 将新加入的词汇当作新词的开头 (eg1:guoj--> guo%,j eg2:guoji -->guo%,j%,i)
- {
- py=last_py_+cur_text.mid(str.size());
- }
- else if(count==2)// 若之前可以匹配现在不行, 则将新加入的字母当作新词的一部分拼音 (eg1:guoj-->guo%,j eg2:guoji -->guo%ji)
- {
- QString str2 = last_py_;
- str2.remove(str2.lastIndexOf("%,"), 2);
- py=str2+cur_text.mid(str.size());
- }else if(count==3)// 将 "last_py_" 最后 3 个字符替换成 "%,", 并补充当前拼音 "arg1" 尚未补充在 "py" 上的内容
- {
- QString str2 = last_py_;
- str2.remove(str2.lastIndexOf("%,"), str2.size()-str2.lastIndexOf("%,"));
- str2.insert(str2.size()-1, "%,");
- py=str2+cur_text.mid(str.size());
- }else
- {
- break;
- }
- }
- }
- // qDebug()<<chinese_list;
- error:
- db_->close();
- last_py_text_=cur_text;
- return list_map;
- }
如何让使用过程尽量简化
这个我决定在每个需要使用到键盘的控件自定义两个信号, 只需要信号连接完毕, 就可以实现自动弹出键盘的功能了.
例如上面的调用过程中, ui->lineEdit_2 就需要添加以下自定义内容:
Image 2.PNG
生成 拼音 - 汉字数据库
这个经过在网上翻江倒海, 找到了语料库, 来获得常用汉字, 汉字词组,
再用 QQ 词库来补充部分常用词组
以下是链接地址
语料库 http://www.aihanyu.org/cncorpus/index.aspx
虚拟键盘
最后, 若事后觉得好用, 就点个赞赏吧, 开发不易.
来源: http://www.jianshu.com/p/dd35c5ebf127