解決思路:
1 在數(shù)據(jù)庫(kù)中增加一個(gè)“漢字--拼音”的數(shù)據(jù)表;
2 在QLineEdit輸入框中監(jiān)聽(tīng)到textChanged時(shí),對(duì)于輸入的字母進(jìn)行判斷處理:
1)根據(jù)最后一個(gè)字母搜索到匹配的漢字;
2)如果這個(gè)是第一個(gè)字母,那么根據(jù)這些漢字去查詢數(shù)據(jù)結(jié)果,如果查詢到,則計(jì)入內(nèi)存(Hash表)中;如果不是第一個(gè)字母,就要根據(jù)前面的內(nèi)存表再連接這個(gè)漢字列表來(lái)查詢數(shù)據(jù)結(jié)果,如果查詢到結(jié)果大于0個(gè),則計(jì)入內(nèi)存中。
3 對(duì)于內(nèi)存中已存在的結(jié)果,直接匹配數(shù)據(jù)庫(kù),直接查詢數(shù)據(jù)庫(kù)結(jié)果。
注意:如果遇到字符格式問(wèn)題,請(qǐng)使用toLocal8Bit()方法。
附上根據(jù)漢字獲取首字母的代碼:(參考:
http://topic.csdn.net/u/20110627/15/dbb95eda-386d-4309-a482-d56955a5d6cd.html)
QString PinYinHelper::getChineseSpell(QString& src)
{
unsigned char ucHigh, ucLow;
int nCode;
QString strPinYin;
for (int i=0; i<src.length(); i++)
{
ucHigh = src[i].unicode();
if (ucHigh < 0x80 )//英文字母
{
strPinYin.append(src[i]);
continue;
}
ucLow = src[i + 1].unicode();
if ( ucHigh < 0xa1 || ucLow < 0xa1)
{
continue;
}
else
{
nCode = (ucHigh - 0xa0) * 100 + ucLow - 0xa0;
}
strPinYin.append(FirstLetter(nCode));
i++;
}
return strPinYin;
}
QString PinYinHelper::FirstLetter(int nCode)
{
if(nCode >= 1601 && nCode < 1637) return "A";
if(nCode >= 1637 && nCode < 1833) return "B";
if(nCode >= 1833 && nCode < 2078) return "C";
if(nCode >= 2078 && nCode < 2274) return "D";
if(nCode >= 2274 && nCode < 2302) return "E";
if(nCode >= 2302 && nCode < 2433) return "F";
if(nCode >= 2433 && nCode < 2594) return "G";
if(nCode >= 2594 && nCode < 2787) return "H";
if(nCode >= 2787 && nCode < 3106) return "J";
if(nCode >= 3106 && nCode < 3212) return "K";
if(nCode >= 3212 && nCode < 3472) return "L";
if(nCode >= 3472 && nCode < 3635) return "M";
if(nCode >= 3635 && nCode < 3722) return "N";
if(nCode >= 3722 && nCode < 3730) return "O";
if(nCode >= 3730 && nCode < 3858) return "P";
if(nCode >= 3858 && nCode < 4027) return "Q";
if(nCode >= 4027 && nCode < 4086) return "R";
if(nCode >= 4086 && nCode < 4390) return "S";
if(nCode >= 4390 && nCode < 4558) return "T";
if(nCode >= 4558 && nCode < 4684) return "W";
if(nCode >= 4684 && nCode < 4925) return "X";
if(nCode >= 4925 && nCode < 5249) return "Y";
if(nCode >= 5249 && nCode < 5590) return "Z";
return "";
}