解決思路:
1 在數據庫中增加一個“漢字--拼音”的數據表;
2 在QLineEdit輸入框中監聽到textChanged時,對于輸入的字母進行判斷處理:
1)根據最后一個字母搜索到匹配的漢字;
2)如果這個是第一個字母,那么根據這些漢字去查詢數據結果,如果查詢到,則計入內存(Hash表)中;如果不是第一個字母,就要根據前面的內存表再連接這個漢字列表來查詢數據結果,如果查詢到結果大于0個,則計入內存中。
3 對于內存中已存在的結果,直接匹配數據庫,直接查詢數據庫結果。
注意:如果遇到字符格式問題,請使用toLocal8Bit()方法。
附上根據漢字獲取首字母的代碼:(參考:
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 "";
}