美文网首页程序员
QT4、QT5下的 中文联想虚拟键盘(软键盘virtual ke

QT4、QT5下的 中文联想虚拟键盘(软键盘virtual ke

作者: Seejv | 来源:发表于2019-03-05 17:41 被阅读0次

由于项目需要,网络上关于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词库来补充部分常用词组

以下是链接地址

语料库
虚拟键盘

最后,若事后觉得好用,就点个赞赏吧,开发不易。

相关文章

网友评论

    本文标题:QT4、QT5下的 中文联想虚拟键盘(软键盘virtual ke

    本文链接:https://www.haomeiwen.com/subject/ixlouqtx.html