美文网首页程序员
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