由于项目需要,网络上关于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 就需要添加以下自定义内容:
生成 拼音-汉字数据库
这个经过在网上翻江倒海,找到了语料库,来获得常用汉字、汉字词组,
再用QQ词库来补充部分常用词组
网友评论