xref: /OK3568_Linux_fs/app/forlinx/flapp/src/keyboard/keyboard/keyboard.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun #include "keyboard.h"
2*4882a593Smuzhiyun #include <QPushButton>
3*4882a593Smuzhiyun #include <QSignalMapper>
4*4882a593Smuzhiyun #include <QHBoxLayout>
5*4882a593Smuzhiyun #include <QVBoxLayout>
6*4882a593Smuzhiyun #include <QGridLayout>
7*4882a593Smuzhiyun #include<QCoreApplication>
8*4882a593Smuzhiyun #include <QMap>
9*4882a593Smuzhiyun #include <QKeyEvent>
10*4882a593Smuzhiyun #include <QPainter>
11*4882a593Smuzhiyun #include <QLineEdit>
12*4882a593Smuzhiyun #include <QDebug>
13*4882a593Smuzhiyun #include <QApplication>
14*4882a593Smuzhiyun #include <QTimer>
15*4882a593Smuzhiyun #include <QDebug>
16*4882a593Smuzhiyun #include <QLineEdit>
17*4882a593Smuzhiyun #include <QLabel>
18*4882a593Smuzhiyun #include <QListView>
19*4882a593Smuzhiyun #include "pinyindecoderservice.h"
20*4882a593Smuzhiyun #include "pinyinime.h"
21*4882a593Smuzhiyun #include "keybutton.h"
22*4882a593Smuzhiyun #include "pinyinbar.h"
23*4882a593Smuzhiyun #include <QLoggingCategory>
24*4882a593Smuzhiyun #include <QMouseEvent>
25*4882a593Smuzhiyun Q_LOGGING_CATEGORY(flapp, "app.keyboard")
26*4882a593Smuzhiyun using namespace ime_pinyin;
27*4882a593Smuzhiyun using namespace QtVirtualKeyboard;
28*4882a593Smuzhiyun 
Keyboard(QWidget * parent)29*4882a593Smuzhiyun Keyboard::Keyboard(QWidget *parent) :
30*4882a593Smuzhiyun     QWidget(parent),
31*4882a593Smuzhiyun     m_inputWidget(Q_NULLPTR),
32*4882a593Smuzhiyun     m_candidates(0),
33*4882a593Smuzhiyun     m_number(0),
34*4882a593Smuzhiyun     m_type(0),
35*4882a593Smuzhiyun     m_shift(false),
36*4882a593Smuzhiyun     m_upper(false)
37*4882a593Smuzhiyun {
38*4882a593Smuzhiyun     qApp->setStyle("Fusion");
39*4882a593Smuzhiyun    ;
40*4882a593Smuzhiyun     setAttribute(Qt::WA_AlwaysStackOnTop);
41*4882a593Smuzhiyun     setWindowFlags(Qt::WindowDoesNotAcceptFocus);
42*4882a593Smuzhiyun     this->setWindowFlags(Qt::Tool);
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun     //设置背景颜色.
45*4882a593Smuzhiyun     this->setAutoFillBackground(true);
46*4882a593Smuzhiyun     QPalette palette = this->palette();
47*4882a593Smuzhiyun     palette.setBrush(QPalette::Background, QColor(242, 242, 242));
48*4882a593Smuzhiyun     this->setPalette(palette);
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun     QFont f;
51*4882a593Smuzhiyun     f.setPixelSize(18);
52*4882a593Smuzhiyun     this->setFont(f);
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun     createKeys();
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun     resetKey();
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun     PinyinDecoderService::getInstance()->resetSearch();
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun     QApplication *a = dynamic_cast<QApplication*>(QCoreApplication::instance());
61*4882a593Smuzhiyun     a->installEventFilter(this);
62*4882a593Smuzhiyun     connect(a, &QApplication::focusChanged, this, &Keyboard::foucsChange);
63*4882a593Smuzhiyun }
64*4882a593Smuzhiyun 
~Keyboard()65*4882a593Smuzhiyun Keyboard::~Keyboard()
66*4882a593Smuzhiyun {
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun }
69*4882a593Smuzhiyun 
createKeys()70*4882a593Smuzhiyun void Keyboard::createKeys()
71*4882a593Smuzhiyun {
72*4882a593Smuzhiyun     m_type = 0;
73*4882a593Smuzhiyun     m_shift= 0;
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun     QVBoxLayout *pVLayout = new QVBoxLayout(this);
76*4882a593Smuzhiyun     pVLayout->setContentsMargins(10, 0, 10, 0);
77*4882a593Smuzhiyun     pVLayout->setSpacing(0);
78*4882a593Smuzhiyun     auto createButtons =[=](QVBoxLayout*pVLayout, int n){
79*4882a593Smuzhiyun         QHBoxLayout *pHLayout = new QHBoxLayout;
80*4882a593Smuzhiyun         pHLayout->setSpacing(0);
81*4882a593Smuzhiyun         for(int i=0; i<n; i++){
82*4882a593Smuzhiyun             KeyButton *button = new KeyButton;
83*4882a593Smuzhiyun             connect(button, &KeyButton::clicked, this, &Keyboard::handleKey);
84*4882a593Smuzhiyun             pHLayout->addWidget(button);
85*4882a593Smuzhiyun             m_buttons << button;
86*4882a593Smuzhiyun         }
87*4882a593Smuzhiyun         pVLayout->addLayout(pHLayout);
88*4882a593Smuzhiyun     };
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun     QHBoxLayout *pHLayout = new QHBoxLayout;
91*4882a593Smuzhiyun     pHLayout->setContentsMargins(10, 0, 10,0);
92*4882a593Smuzhiyun     m_bar = new PinyinBar;
93*4882a593Smuzhiyun     connect(m_bar, &PinyinBar::textChose, this, &Keyboard::textChose);
94*4882a593Smuzhiyun     pHLayout->addWidget(m_bar);
95*4882a593Smuzhiyun     pVLayout->addLayout(pHLayout);
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun     createButtons(pVLayout, 14);//第一行.
98*4882a593Smuzhiyun     createButtons(pVLayout, 14); //第二行.
99*4882a593Smuzhiyun     createButtons(pVLayout, 13);//第三行.
100*4882a593Smuzhiyun     createButtons(pVLayout, 13);//第四行.
101*4882a593Smuzhiyun }
102*4882a593Smuzhiyun 
resetKey()103*4882a593Smuzhiyun void Keyboard::resetKey()
104*4882a593Smuzhiyun {                               //正常键盘显示.
105*4882a593Smuzhiyun     static Qt::Key key[2][54] ={Qt::Key_QuoteLeft,  Qt::Key_1, Qt::Key_2,Qt::Key_3,Qt::Key_4,Qt::Key_5,Qt::Key_6,Qt::Key_7,Qt::Key_8,Qt::Key_9, Qt::Key_0,
106*4882a593Smuzhiyun                                 Qt::Key_Underscore, Qt::Key_Equal, Qt::Key_Backspace,//14  //第一行.
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun                                 Qt::Key_Q, Qt::Key_W,Qt::Key_E,Qt::Key_R,Qt::Key_T,Qt::Key_Y,Qt::Key_U,Qt::Key_I,Qt::Key_O, Qt::Key_P,
109*4882a593Smuzhiyun                                 Qt::Key_BracketLeft, Qt::Key_BracketRight, Qt::Key_Return,Qt::Key_Tab,//14 第二行.
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun                                 Qt::Key_CapsLock,  Qt::Key_A, Qt::Key_S,Qt::Key_D,Qt::Key_F,Qt::Key_G,Qt::Key_H,Qt::Key_J,Qt::Key_K,Qt::Key_L, Qt::Key_Semicolon,
112*4882a593Smuzhiyun                                 Qt::Key_Apostrophe, Qt::Key_QuoteDbl,//13第三行.
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun                                 Qt::Key_Shift,  Qt::Key_Z, Qt::Key_X,Qt::Key_C,Qt::Key_V,Qt::Key_B,Qt::Key_Space, Qt::Key_N,Qt::Key_M, Qt::Key_Comma ,Qt::Key_Period, Qt::Key_Slash,
115*4882a593Smuzhiyun                                 Qt::Key_Multi_key,//12第四行.
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun                                 //shift 按键切换显示.
118*4882a593Smuzhiyun                                 Qt::Key_AsciiTilde, Qt::Key_Exclam, Qt::Key_At, Qt::Key_NumberSign,Qt::Key_Dollar,Qt::Key_Percent,Qt::Key_AsciiCircum,Qt::Key_Ampersand,
119*4882a593Smuzhiyun                                 Qt::Key_Asterisk,Qt::Key_ParenLeft, Qt::Key_ParenRight,
120*4882a593Smuzhiyun                                 Qt::Key_Minus, Qt::Key_Plus, Qt::Key_Backspace, //14第一行.
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun                                 Qt::Key_Q, Qt::Key_W,Qt::Key_E,Qt::Key_R,Qt::Key_T,Qt::Key_Y,Qt::Key_U,Qt::Key_I,Qt::Key_O, Qt::Key_P,
123*4882a593Smuzhiyun                                 Qt::Key_BraceLeft, Qt::Key_BraceRight, Qt::Key_Return,Qt::Key_Tab, //14第二行.
124*4882a593Smuzhiyun 
125*4882a593Smuzhiyun                                 Qt::Key_CapsLock,  Qt::Key_A, Qt::Key_S,Qt::Key_D,Qt::Key_F,Qt::Key_G,Qt::Key_H,Qt::Key_J,Qt::Key_K,Qt::Key_L, Qt::Key_Colon,
126*4882a593Smuzhiyun                                 Qt::Key_QuoteDbl, Qt::Key_Bar, //13第三行.
127*4882a593Smuzhiyun 
128*4882a593Smuzhiyun                                 Qt::Key_Shift,  Qt::Key_Z, Qt::Key_X,Qt::Key_C,Qt::Key_V,Qt::Key_B, Qt::Key_Space, Qt::Key_N,Qt::Key_M,Qt::Key_Less,Qt::Key_Greater, Qt::Key_Question,
129*4882a593Smuzhiyun                                 Qt::Key_Multi_key}; //13第四行.
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun     for(int i=0; i<54 && i<m_buttons.size(); i++)
133*4882a593Smuzhiyun     {
134*4882a593Smuzhiyun         Qt::Key k = key[m_shift][i];
135*4882a593Smuzhiyun         m_buttons[i]->setKey(k);
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun         QString value = getKey(k);
138*4882a593Smuzhiyun         m_upper ? value =value.toUpper() :value =value.toLower();
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun         m_buttons[i]->setValue(value);
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun         //特殊按键替换处理.
143*4882a593Smuzhiyun         switch (k) {
144*4882a593Smuzhiyun         case Qt::Key_Return:
145*4882a593Smuzhiyun             m_buttons[i]->setValue("↵");
146*4882a593Smuzhiyun             break;
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun         case Qt::Key_Space:
149*4882a593Smuzhiyun             m_buttons[i]->setMinimumWidth(60);
150*4882a593Smuzhiyun             break;
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun         case Qt::Key_Backspace:
153*4882a593Smuzhiyun             m_buttons[i]->setValue("←");
154*4882a593Smuzhiyun             m_buttons[i]->setAutoRepeat(true);
155*4882a593Smuzhiyun             break;
156*4882a593Smuzhiyun 
157*4882a593Smuzhiyun         case Qt::Key_Tab:
158*4882a593Smuzhiyun             m_buttons[i]->setValue("Hide");
159*4882a593Smuzhiyun             break;
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun         case Qt::Key_CapsLock:
162*4882a593Smuzhiyun             m_buttons[i]->setValue("caps");
163*4882a593Smuzhiyun             break;
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun         case Qt::Key_Shift:
166*4882a593Smuzhiyun             m_buttons[i]->setValue("↑");
167*4882a593Smuzhiyun             break;
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun         case Qt::Key_Multi_key:
170*4882a593Smuzhiyun             m_type== 1?  m_buttons[i]->setValue("中"): m_buttons[i]->setValue("en");
171*4882a593Smuzhiyun             break;
172*4882a593Smuzhiyun         default:
173*4882a593Smuzhiyun             break;
174*4882a593Smuzhiyun         }
175*4882a593Smuzhiyun     }
176*4882a593Smuzhiyun }
177*4882a593Smuzhiyun 
getKey(Qt::Key key)178*4882a593Smuzhiyun QString Keyboard::getKey(Qt::Key key)
179*4882a593Smuzhiyun {
180*4882a593Smuzhiyun     struct KeyData{
181*4882a593Smuzhiyun         QString value[2];  //value[0] 英文字符 value[1] 中文字符.
182*4882a593Smuzhiyun         Qt::Key k;
183*4882a593Smuzhiyun     };
184*4882a593Smuzhiyun     static struct KeyData data[73]={
185*4882a593Smuzhiyun                "~", "~", Qt::Key_AsciiTilde,
186*4882a593Smuzhiyun                 "!", "!", Qt::Key_Exclam,
187*4882a593Smuzhiyun                 "@", "@", Qt::Key_At,
188*4882a593Smuzhiyun                 "#", "#", Qt::Key_NumberSign,
189*4882a593Smuzhiyun                 "$", "¥", Qt::Key_Dollar,
190*4882a593Smuzhiyun                 "%", "%", Qt::Key_Percent,
191*4882a593Smuzhiyun                 "^", "……", Qt::Key_AsciiCircum,
192*4882a593Smuzhiyun                 "&", "&", Qt::Key_Ampersand,
193*4882a593Smuzhiyun                 "*", "*", Qt::Key_Asterisk,
194*4882a593Smuzhiyun                 "(", "(", Qt::Key_ParenLeft,
195*4882a593Smuzhiyun                 ")", ")", Qt::Key_ParenRight,
196*4882a593Smuzhiyun                 "_", "——", Qt::Key_Underscore,
197*4882a593Smuzhiyun                 "+", "+", Qt::Key_Plus,
198*4882a593Smuzhiyun                 "}", "】", Qt::Key_BraceRight,
199*4882a593Smuzhiyun                 "{", "【", Qt::Key_BraceLeft,
200*4882a593Smuzhiyun                 "\"", "、", Qt::Key_QuoteDbl,
201*4882a593Smuzhiyun                 "|", "|", Qt::Key_Bar,
202*4882a593Smuzhiyun                 "?", "?", Qt::Key_Question,
203*4882a593Smuzhiyun                 ">", "》", Qt::Key_Greater,
204*4882a593Smuzhiyun                 "<", "《", Qt::Key_Less,
205*4882a593Smuzhiyun                 "-", "-", Qt::Key_Minus,
206*4882a593Smuzhiyun                 "=", "=", Qt::Key_Equal,
207*4882a593Smuzhiyun                 "[", "『", Qt::Key_BracketLeft,
208*4882a593Smuzhiyun                 "]", "』", Qt::Key_BracketRight,
209*4882a593Smuzhiyun                 "\\", "、", Qt::Key_Backslash,
210*4882a593Smuzhiyun                 "'", "‘", Qt::Key_Apostrophe,
211*4882a593Smuzhiyun                 ";", ";", Qt::Key_Semicolon,
212*4882a593Smuzhiyun                 "/", "/", Qt::Key_Slash,
213*4882a593Smuzhiyun                 ".", "。", Qt::Key_Period,
214*4882a593Smuzhiyun                 ",", ",", Qt::Key_Comma,
215*4882a593Smuzhiyun                 "\r","\r", Qt::Key_Return,
216*4882a593Smuzhiyun                 "\b", "\b",Qt::Key_Backspace,
217*4882a593Smuzhiyun                 " "," ", Qt::Key_Space,
218*4882a593Smuzhiyun                 "`", "·", Qt::Key_QuoteLeft,
219*4882a593Smuzhiyun                 ":" ,":" ,Qt::Key_Colon,
220*4882a593Smuzhiyun                 "P", "P", Qt::Key_P,
221*4882a593Smuzhiyun                 "O", "O", Qt::Key_O,
222*4882a593Smuzhiyun                 "I", "I", Qt::Key_I,
223*4882a593Smuzhiyun                 "U", "U", Qt::Key_U,
224*4882a593Smuzhiyun                 "Y", "Y", Qt::Key_Y,
225*4882a593Smuzhiyun                 "T", "T", Qt::Key_T,
226*4882a593Smuzhiyun                 "R", "R", Qt::Key_R,
227*4882a593Smuzhiyun                 "E", "E", Qt::Key_E,
228*4882a593Smuzhiyun                 "W", "W", Qt::Key_W,
229*4882a593Smuzhiyun                 "Q", "Q", Qt::Key_Q,
230*4882a593Smuzhiyun                 "A", "A", Qt::Key_A,
231*4882a593Smuzhiyun                 "S", "S", Qt::Key_S,
232*4882a593Smuzhiyun                 "D", "D", Qt::Key_D,
233*4882a593Smuzhiyun                 "F", "F", Qt::Key_F,
234*4882a593Smuzhiyun                 "G", "G", Qt::Key_G,
235*4882a593Smuzhiyun                 "H", "H", Qt::Key_H,
236*4882a593Smuzhiyun                 "J", "J", Qt::Key_J,
237*4882a593Smuzhiyun                 "K", "K", Qt::Key_K,
238*4882a593Smuzhiyun                 "L", "L", Qt::Key_L,
239*4882a593Smuzhiyun                 "M", "M", Qt::Key_M,
240*4882a593Smuzhiyun                 "N", "N", Qt::Key_N,
241*4882a593Smuzhiyun                 "B", "B", Qt::Key_B,
242*4882a593Smuzhiyun                 "V", "V", Qt::Key_V,
243*4882a593Smuzhiyun                 "C", "C", Qt::Key_C,
244*4882a593Smuzhiyun                 "X", "X", Qt::Key_X,
245*4882a593Smuzhiyun                 "Z", "Z", Qt::Key_Z,
246*4882a593Smuzhiyun                 "1", "1", Qt::Key_1,
247*4882a593Smuzhiyun                 "2", "2", Qt::Key_2,
248*4882a593Smuzhiyun                 "3", "3", Qt::Key_3,
249*4882a593Smuzhiyun                 "4", "4", Qt::Key_4,
250*4882a593Smuzhiyun                 "5", "5", Qt::Key_5,
251*4882a593Smuzhiyun                 "6", "6", Qt::Key_6,
252*4882a593Smuzhiyun                 "7", "7", Qt::Key_7,
253*4882a593Smuzhiyun                 "8", "8", Qt::Key_8,
254*4882a593Smuzhiyun                 "9", "9", Qt::Key_9,
255*4882a593Smuzhiyun                 "0", "0", Qt::Key_0,
256*4882a593Smuzhiyun                 "",  "", Qt::Key_CapsLock,
257*4882a593Smuzhiyun                 " ", " ", Qt::Key_Space
258*4882a593Smuzhiyun     };
259*4882a593Smuzhiyun 
260*4882a593Smuzhiyun     for(int i=0; i<72; i++){
261*4882a593Smuzhiyun         KeyData d= data[i];
262*4882a593Smuzhiyun         if(d.k == key){
263*4882a593Smuzhiyun             return d.value[m_type];
264*4882a593Smuzhiyun         }
265*4882a593Smuzhiyun     }
266*4882a593Smuzhiyun     return "";
267*4882a593Smuzhiyun }
268*4882a593Smuzhiyun 
handleKey()269*4882a593Smuzhiyun void Keyboard::handleKey()
270*4882a593Smuzhiyun {
271*4882a593Smuzhiyun     KeyButton *button  = dynamic_cast<KeyButton*>(this->sender());
272*4882a593Smuzhiyun     if(m_inputWidget && button){
273*4882a593Smuzhiyun 
274*4882a593Smuzhiyun         switch (button->getKey()) {
275*4882a593Smuzhiyun         case Qt::Key_CapsLock:
276*4882a593Smuzhiyun             m_upper =!m_upper;
277*4882a593Smuzhiyun             resetKey();
278*4882a593Smuzhiyun             return;
279*4882a593Smuzhiyun 
280*4882a593Smuzhiyun         case Qt::Key_Tab:
281*4882a593Smuzhiyun             this->setVisible(false);
282*4882a593Smuzhiyun             return;
283*4882a593Smuzhiyun 
284*4882a593Smuzhiyun         case Qt::Key_Shift:
285*4882a593Smuzhiyun             m_shift = !m_shift;
286*4882a593Smuzhiyun             resetKey();
287*4882a593Smuzhiyun             return;
288*4882a593Smuzhiyun 
289*4882a593Smuzhiyun         case Qt::Key_Multi_key:
290*4882a593Smuzhiyun         {
291*4882a593Smuzhiyun             if(m_type==0){
292*4882a593Smuzhiyun                 m_type =1;
293*4882a593Smuzhiyun             }else if(m_type ==1)
294*4882a593Smuzhiyun             {
295*4882a593Smuzhiyun                 m_type =0;
296*4882a593Smuzhiyun             }
297*4882a593Smuzhiyun             resetKey();
298*4882a593Smuzhiyun         }
299*4882a593Smuzhiyun             return;
300*4882a593Smuzhiyun         default:
301*4882a593Smuzhiyun             break;
302*4882a593Smuzhiyun         }
303*4882a593Smuzhiyun 
304*4882a593Smuzhiyun         if(m_type ==1  && button->getKey()>= Qt::Key_A && button->getKey() <= Qt::Key_Z )
305*4882a593Smuzhiyun         {
306*4882a593Smuzhiyun             addSearch(button->getValue());
307*4882a593Smuzhiyun             return;
308*4882a593Smuzhiyun         }else if(button->getKey() == Qt::Key_Backspace && m_bar->count() !=0)
309*4882a593Smuzhiyun         {
310*4882a593Smuzhiyun             PinyinDecoderService *pinyin =PinyinDecoderService::getInstance();
311*4882a593Smuzhiyun             QString str = pinyin->pinyinString(false);
312*4882a593Smuzhiyun             clearpinyin();
313*4882a593Smuzhiyun             if(str.size()>=1)
314*4882a593Smuzhiyun             {
315*4882a593Smuzhiyun                 str = str.left(str.size()-1);
316*4882a593Smuzhiyun             }
317*4882a593Smuzhiyun             addSearch(str);
318*4882a593Smuzhiyun             return;
319*4882a593Smuzhiyun         }
320*4882a593Smuzhiyun 
321*4882a593Smuzhiyun         Qt::Key key = button->getKey();
322*4882a593Smuzhiyun         QString value =getKey(key);
323*4882a593Smuzhiyun         if(!m_upper)
324*4882a593Smuzhiyun         {
325*4882a593Smuzhiyun             value = value.toLower();
326*4882a593Smuzhiyun         }
327*4882a593Smuzhiyun 
328*4882a593Smuzhiyun         QKeyEvent k(QEvent::KeyPress, key,  Qt::NoModifier, value);
329*4882a593Smuzhiyun         qApp->sendEvent(m_inputWidget, &k);
330*4882a593Smuzhiyun     }
331*4882a593Smuzhiyun }
332*4882a593Smuzhiyun 
hideEvent(QHideEvent * event)333*4882a593Smuzhiyun void Keyboard::hideEvent(QHideEvent *event)
334*4882a593Smuzhiyun {
335*4882a593Smuzhiyun     QWidget::hideEvent(event);
336*4882a593Smuzhiyun     clearpinyin();
337*4882a593Smuzhiyun     addSearch();
338*4882a593Smuzhiyun }
339*4882a593Smuzhiyun 
clearpinyin()340*4882a593Smuzhiyun void Keyboard::clearpinyin()
341*4882a593Smuzhiyun {
342*4882a593Smuzhiyun     PinyinDecoderService *pinyin =PinyinDecoderService::getInstance();
343*4882a593Smuzhiyun     QString str =pinyin->pinyinString(false);
344*4882a593Smuzhiyun     for(int i=0; i<str.size(); i++)
345*4882a593Smuzhiyun     {
346*4882a593Smuzhiyun         pinyin->deleteSearch(0, true, true);
347*4882a593Smuzhiyun     }
348*4882a593Smuzhiyun }
349*4882a593Smuzhiyun 
addSearch(const QString & s)350*4882a593Smuzhiyun void Keyboard::addSearch(const QString &s)
351*4882a593Smuzhiyun {
352*4882a593Smuzhiyun     PinyinDecoderService *pinyin =PinyinDecoderService::getInstance();
353*4882a593Smuzhiyun     QString d =pinyin->pinyinString(false);
354*4882a593Smuzhiyun     qCDebug(flapp)<<"search str ="<< d;
355*4882a593Smuzhiyun     if(s.isEmpty())
356*4882a593Smuzhiyun     {
357*4882a593Smuzhiyun         if(!d.isEmpty())
358*4882a593Smuzhiyun         {
359*4882a593Smuzhiyun             m_candidates = pinyin->search(d);
360*4882a593Smuzhiyun         }
361*4882a593Smuzhiyun     }else{
362*4882a593Smuzhiyun         m_candidates = pinyin->search(d + s);
363*4882a593Smuzhiyun     }
364*4882a593Smuzhiyun     QList<QString> candList = pinyin->fetchCandidates(0, m_candidates, 0);
365*4882a593Smuzhiyun 
366*4882a593Smuzhiyun     qCDebug(flapp)<<"search list ="<< candList.size();
367*4882a593Smuzhiyun     QStringList list (candList);
368*4882a593Smuzhiyun     list.removeAll("");
369*4882a593Smuzhiyun     m_bar->setStringList(list, pinyin->pinyinString(false));
370*4882a593Smuzhiyun     if(list.isEmpty())
371*4882a593Smuzhiyun     {
372*4882a593Smuzhiyun          clearpinyin();
373*4882a593Smuzhiyun     }
374*4882a593Smuzhiyun }
375*4882a593Smuzhiyun 
textChose(const QString & text,int index)376*4882a593Smuzhiyun void Keyboard::textChose(const QString &text, int index)
377*4882a593Smuzhiyun {
378*4882a593Smuzhiyun     qCDebug(flapp)<<"textChose : text ="<< text << " index ="<< index;
379*4882a593Smuzhiyun 
380*4882a593Smuzhiyun     static PinyinDecoderService *pinyin =PinyinDecoderService::getInstance();
381*4882a593Smuzhiyun     QVector<int>vec =pinyin->spellingStartPositions();
382*4882a593Smuzhiyun     if(vec.size() >0)
383*4882a593Smuzhiyun     qCDebug(flapp)<< "count="<<vec.size() << "vec[0]="<< vec[0];
384*4882a593Smuzhiyun     if(vec.size() >0  && m_number < vec[0])
385*4882a593Smuzhiyun     {
386*4882a593Smuzhiyun         pinyin->chooceCandidate(index);
387*4882a593Smuzhiyun         QList<QString> candList = pinyin->fetchCandidates(0, m_candidates, 0);
388*4882a593Smuzhiyun         m_list = QStringList(candList);
389*4882a593Smuzhiyun         m_bar->setStringList(m_list, pinyin->pinyinString(false));
390*4882a593Smuzhiyun         QString data = text;
391*4882a593Smuzhiyun         if(data.size() == vec[0])
392*4882a593Smuzhiyun         {
393*4882a593Smuzhiyun             data = data.right(data.size()-m_number);
394*4882a593Smuzhiyun             m_number =vec[0];
395*4882a593Smuzhiyun         }else{
396*4882a593Smuzhiyun             m_number += text.size();
397*4882a593Smuzhiyun         }
398*4882a593Smuzhiyun         QKeyEvent k(QEvent::KeyPress, Qt::Key_MultipleCandidate, Qt::NoModifier, data);
399*4882a593Smuzhiyun         qApp->sendEvent(m_inputWidget, &k);
400*4882a593Smuzhiyun         if(m_number == vec[0]){
401*4882a593Smuzhiyun             m_number =0;
402*4882a593Smuzhiyun             m_bar->setStringList(QStringList());
403*4882a593Smuzhiyun             clearpinyin();
404*4882a593Smuzhiyun             qCDebug(flapp)<<"reset search";
405*4882a593Smuzhiyun         }
406*4882a593Smuzhiyun     }
407*4882a593Smuzhiyun }
408*4882a593Smuzhiyun 
eventFilter(QObject * watched,QEvent * event)409*4882a593Smuzhiyun bool Keyboard::eventFilter(QObject *watched, QEvent *event)
410*4882a593Smuzhiyun {
411*4882a593Smuzhiyun     switch (event->type()) {
412*4882a593Smuzhiyun //    case QEvent::FocusIn:
413*4882a593Smuzhiyun //    {
414*4882a593Smuzhiyun //        QWidget *now = dynamic_cast<QWidget*>(watched);
415*4882a593Smuzhiyun //        QFocusEvent *foucsEvent = dynamic_cast<QFocusEvent*>(event);
416*4882a593Smuzhiyun //        if(hasInput(now) && foucsEvent->reason() == Qt::MouseFocusReason)
417*4882a593Smuzhiyun //        {
418*4882a593Smuzhiyun //            if(m_inputWidget != Q_NULLPTR){
419*4882a593Smuzhiyun //                m_inputWidget->removeEventFilter(this);
420*4882a593Smuzhiyun //                this->disconnect(this);
421*4882a593Smuzhiyun //            }
422*4882a593Smuzhiyun //            now->installEventFilter(this);
423*4882a593Smuzhiyun //            m_inputWidget = now;
424*4882a593Smuzhiyun //            resizeWidget(m_inputWidget);
425*4882a593Smuzhiyun //            setVisible(true);
426*4882a593Smuzhiyun 
427*4882a593Smuzhiyun //        }
428*4882a593Smuzhiyun 
429*4882a593Smuzhiyun //    }break;
430*4882a593Smuzhiyun 
431*4882a593Smuzhiyun     case QEvent::Destroy:
432*4882a593Smuzhiyun     {
433*4882a593Smuzhiyun        if(watched == m_inputWidget){
434*4882a593Smuzhiyun            setParent(Q_NULLPTR);
435*4882a593Smuzhiyun            m_inputWidget = Q_NULLPTR;
436*4882a593Smuzhiyun        }
437*4882a593Smuzhiyun 
438*4882a593Smuzhiyun     }break;
439*4882a593Smuzhiyun     case QEvent::MouseButtonPress:
440*4882a593Smuzhiyun     {
441*4882a593Smuzhiyun         QMouseEvent *mouseEvent =dynamic_cast<QMouseEvent*>(event);
442*4882a593Smuzhiyun        if(watched == m_inputWidget&&mouseEvent->button() == Qt::LeftButton  && hasInput(m_inputWidget))
443*4882a593Smuzhiyun        {
444*4882a593Smuzhiyun            this->resizeWidget(m_inputWidget);
445*4882a593Smuzhiyun            this->setVisible(true);
446*4882a593Smuzhiyun            event->accept();
447*4882a593Smuzhiyun            return true;
448*4882a593Smuzhiyun        }
449*4882a593Smuzhiyun 
450*4882a593Smuzhiyun     }break;
451*4882a593Smuzhiyun 
452*4882a593Smuzhiyun     case QEvent::Resize:
453*4882a593Smuzhiyun     {
454*4882a593Smuzhiyun        if(watched == this)
455*4882a593Smuzhiyun        {
456*4882a593Smuzhiyun            resizeWidget(m_inputWidget);
457*4882a593Smuzhiyun            event->accept();
458*4882a593Smuzhiyun            return true;
459*4882a593Smuzhiyun        }
460*4882a593Smuzhiyun     }break;
461*4882a593Smuzhiyun 
462*4882a593Smuzhiyun     case QEvent::WindowDeactivate:
463*4882a593Smuzhiyun     {
464*4882a593Smuzhiyun         if(watched == qApp)
465*4882a593Smuzhiyun         {
466*4882a593Smuzhiyun             qApp->activeWindow()->clearFocus();
467*4882a593Smuzhiyun         }
468*4882a593Smuzhiyun     }break;
469*4882a593Smuzhiyun     default:
470*4882a593Smuzhiyun         break;
471*4882a593Smuzhiyun     }
472*4882a593Smuzhiyun 
473*4882a593Smuzhiyun     return QWidget::eventFilter(watched, event);
474*4882a593Smuzhiyun }
475*4882a593Smuzhiyun 
resizeWidget(QWidget * w)476*4882a593Smuzhiyun void Keyboard::resizeWidget(QWidget *w)
477*4882a593Smuzhiyun {
478*4882a593Smuzhiyun     QWidget *topWidget = w->topLevelWidget();
479*4882a593Smuzhiyun     setParent(topWidget);
480*4882a593Smuzhiyun 
481*4882a593Smuzhiyun     int width = topWidget->width();
482*4882a593Smuzhiyun     int height = topLevelWidget()->height()/3;
483*4882a593Smuzhiyun     if(height< 150){
484*4882a593Smuzhiyun         height =150;
485*4882a593Smuzhiyun     }
486*4882a593Smuzhiyun     //输入控件在位置比最顶层父窗口位置一半大, 显示在最顶层窗口哦上面,否则显示在最顶层窗口底部.
487*4882a593Smuzhiyun     QPoint pos = w->mapTo(topWidget, w->pos());
488*4882a593Smuzhiyun     qCDebug(flapp)<<"input widget pos: "<< w->pos() << "global pos: "<< pos << "window rect: s" << topWidget->rect();
489*4882a593Smuzhiyun 
490*4882a593Smuzhiyun     if(pos.y() <= topWidget->height()/2){
491*4882a593Smuzhiyun         this->setGeometry(0,topWidget->height() -height-20, width, height);
492*4882a593Smuzhiyun     }else{
493*4882a593Smuzhiyun         this->setGeometry(0,20, width, height);
494*4882a593Smuzhiyun     }
495*4882a593Smuzhiyun }
496*4882a593Smuzhiyun 
hasInput(QWidget * w)497*4882a593Smuzhiyun bool Keyboard::hasInput(QWidget *w)
498*4882a593Smuzhiyun {
499*4882a593Smuzhiyun     bool bRet =false;
500*4882a593Smuzhiyun     //过滤 QListView 输入,防止QComboBox上显示键盘.
501*4882a593Smuzhiyun     if(w != Q_NULLPTR && dynamic_cast<QAbstractItemView*>(w))
502*4882a593Smuzhiyun         return bRet;
503*4882a593Smuzhiyun 
504*4882a593Smuzhiyun     //所有输入控件必须有WA_InputMethodEnabled 属性方可显示.
505*4882a593Smuzhiyun     if(w!= Q_NULLPTR
506*4882a593Smuzhiyun             && w->isEnabled()
507*4882a593Smuzhiyun             &&w->testAttribute(Qt::WA_InputMethodEnabled))
508*4882a593Smuzhiyun     {
509*4882a593Smuzhiyun         bRet =true;
510*4882a593Smuzhiyun     }
511*4882a593Smuzhiyun 
512*4882a593Smuzhiyun     return bRet;
513*4882a593Smuzhiyun }
514*4882a593Smuzhiyun 
foucsChange(QWidget * old,QWidget * now)515*4882a593Smuzhiyun void Keyboard::foucsChange(QWidget *old, QWidget *now)
516*4882a593Smuzhiyun {
517*4882a593Smuzhiyun     Q_UNUSED(old)
518*4882a593Smuzhiyun     if(hasInput(now))
519*4882a593Smuzhiyun     {
520*4882a593Smuzhiyun         if(m_inputWidget != Q_NULLPTR){
521*4882a593Smuzhiyun             m_inputWidget->removeEventFilter(this);
522*4882a593Smuzhiyun             m_inputWidget->topLevelWidget()->removeEventFilter(this);
523*4882a593Smuzhiyun             this->disconnect(this);
524*4882a593Smuzhiyun         }
525*4882a593Smuzhiyun         now->installEventFilter(this);
526*4882a593Smuzhiyun         m_inputWidget = now;
527*4882a593Smuzhiyun         resizeWidget(m_inputWidget);
528*4882a593Smuzhiyun         setVisible(true);
529*4882a593Smuzhiyun 
530*4882a593Smuzhiyun     }
531*4882a593Smuzhiyun }
532*4882a593Smuzhiyun 
533