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