1 #include "qtkeyboard.h"
2 #include "ui_qtkeyboard.h"
3 #include <QDebug>
4 #include <QTimer>
5 #include <QDesktopWidget>
6
7 QKeyBoard* QKeyBoard::_instance = nullptr;
8 #define str_board_close "Close"
9 #define SHIFT_ON "SHIFT"
10 #define SHIFT_OFF "shift"
11
QKeyBoard(QWidget * parent)12 QKeyBoard::QKeyBoard(QWidget *parent) : QWidget(parent),
13 ui(new Ui::QKeyBoard),
14 isShiftOn(false),
15 lineEdit(nullptr),
16 mousePressed(false)
17 {
18 ui->setupUi(this);
19 ui->btna->setProperty("btnLetter", true);
20 ui->btnb->setProperty("btnLetter", true);
21 ui->btnc->setProperty("btnLetter", true);
22 ui->btnd->setProperty("btnLetter", true);
23 ui->btne->setProperty("btnLetter", true);
24 ui->btnf->setProperty("btnLetter", true);
25 ui->btng->setProperty("btnLetter", true);
26 ui->btnh->setProperty("btnLetter", true);
27 ui->btni->setProperty("btnLetter", true);
28 ui->btnj->setProperty("btnLetter", true);
29 ui->btnk->setProperty("btnLetter", true);
30 ui->btnl->setProperty("btnLetter", true);
31 ui->btnm->setProperty("btnLetter", true);
32 ui->btnn->setProperty("btnLetter", true);
33 ui->btno->setProperty("btnLetter", true);
34 ui->btnp->setProperty("btnLetter", true);
35 ui->btnq->setProperty("btnLetter", true);
36 ui->btnr->setProperty("btnLetter", true);
37 ui->btns->setProperty("btnLetter", true);
38 ui->btnt->setProperty("btnLetter", true);
39 ui->btnu->setProperty("btnLetter", true);
40 ui->btnv->setProperty("btnLetter", true);
41 ui->btnw->setProperty("btnLetter", true);
42 ui->btnx->setProperty("btnLetter", true);
43 ui->btny->setProperty("btnLetter", true);
44 ui->btnz->setProperty("btnLetter", true);
45
46 const QRect availableGeometry = QApplication::desktop()->availableGeometry();
47 QFont font;
48 font.setPixelSize(availableGeometry.height()/20);
49 setWindowFlags(Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint);
50 connect(qApp, SIGNAL(focusChanged(QWidget*, QWidget*)),
51 this, SLOT(slot_onApplicationFocusChanged(QWidget*, QWidget*)));
52 qApp->installEventFilter(this);
53
54 QList<QPushButton*> btns = this->findChildren<QPushButton*>();
55 foreach (QPushButton *button, btns) {
56 connect(button, SIGNAL(clicked()), this, SLOT(btn_clicked()));
57 button->setFont(font);
58 }
59 }
60
~QKeyBoard()61 QKeyBoard::~QKeyBoard()
62 {
63 delete ui;
64 _instance = nullptr;
65 }
66
changeInputType(bool on)67 void QKeyBoard::changeInputType(bool on)
68 {
69 QString str;
70 ui->btnShift->setText(on?SHIFT_ON:SHIFT_OFF);
71 QList<QPushButton*> buttons = this->findChildren<QPushButton*>();
72 foreach (QPushButton *button, buttons) {
73 if (button->property("btnLetter").toBool()) {
74 if (on)
75 button->setText(button->text().toUpper());
76 else
77 button->setText(button->text().toLower());
78 } else if(! button->objectName().compare("btnApostrophe")){
79 button->setText(on?"\"":"\'");
80 } else if(! button->objectName().compare("btnBackslash")){
81 button->setText(on?"|":"\\");
82 } else if(! button->objectName().compare("btnComma")){
83 button->setText(on?"<":",");
84 } else if(! button->objectName().compare("btnDash")){
85 button->setText(on?"_":"-");
86 } else if(! button->objectName().compare("btnDot")){
87 button->setText(on?">":".");
88 } else if(! button->objectName().compare("btnEquals")){
89 button->setText(on?"+":"=");
90 } else if(! button->objectName().compare("btnSemicolon")){
91 button->setText(on?":":";");
92 } else if(! button->objectName().compare("btnSlash")){
93 button->setText(on?"?":"/");
94 } else if(! button->objectName().compare("btnOther1")){
95 button->setText(on?"~":"`");
96 } else if(! button->objectName().compare("btnOther2")){
97 button->setText(on?"{":"[");
98 } else if(! button->objectName().compare("btnOther3")){
99 button->setText(on?"}":"]");
100 } else if(! button->objectName().compare("btn1")){
101 button->setText(on?"!":"1");
102 } else if(! button->objectName().compare("btn2")){
103 button->setText(on?"@":"2");
104 } else if(! button->objectName().compare("btn3")){
105 button->setText(on?"#":"3");
106 } else if(! button->objectName().compare("btn4")){
107 button->setText(on?"$":"4");
108 } else if(! button->objectName().compare("btn5")){
109 button->setText(on?"%":"5");
110 } else if(! button->objectName().compare("btn6")){
111 button->setText(on?"^":"6");
112 } else if(! button->objectName().compare("btn7")){
113 button->setText(on?"&":"7");
114 } else if(! button->objectName().compare("btn8")){
115 button->setText(on?"*":"8");
116 } else if(! button->objectName().compare("btn9")){
117 button->setText(on?"(":"9");
118 } else if(! button->objectName().compare("btn0")){
119 button->setText(on?")":"0");
120 }
121 }
122 }
123
showPanel()124 void QKeyBoard::showPanel()
125 {
126 changeInputType(isShiftOn);
127 this->setVisible(true);
128 }
129
hidePanel()130 void QKeyBoard::hidePanel()
131 {
132 this->setVisible(false);
133 }
134
slot_onApplicationFocusChanged(QWidget *,QWidget * nowWidget)135 void QKeyBoard::slot_onApplicationFocusChanged(QWidget *, QWidget *nowWidget)
136 {
137 if (nowWidget != nullptr && !this->isAncestorOf(nowWidget)) {
138 if (nowWidget->inherits("QLineEdit")) {
139 lineEdit = (QLineEdit*)nowWidget;
140 showPanel();
141 } else {
142 hidePanel();
143 }
144
145 const QRect availableGeometry = QApplication::desktop()->availableGeometry();
146 resize(availableGeometry.width(), height());
147 move(0, availableGeometry.height() - height());
148 }
149 }
150
btn_clicked()151 void QKeyBoard::btn_clicked()
152 {
153 if (lineEdit == nullptr) {
154 return;
155 }
156
157 QPushButton *button = (QPushButton*)sender();
158 QString objectName = button->objectName();
159 if (objectName == "btnBackspace") {
160 lineEdit->backspace();
161 } else if (objectName == "btnClose") {
162 // foucs other widget first.
163 if (lineEdit && lineEdit->parentWidget())
164 lineEdit->parentWidget()->setFocus();
165 hidePanel();
166 } else if (objectName == "btnSpace") {
167 insertValue(" ");
168 } else if (objectName == "btnShift") {
169 isShiftOn = (isShiftOn == true) ? false : true;
170 changeInputType(isShiftOn);
171 } else {
172 insertValue(button->text());
173 }
174 }
175
insertValue(const QString & value)176 void QKeyBoard::insertValue(const QString &value)
177 {
178 if (lineEdit->text().length() < 20)
179 lineEdit->insert(value);
180 }
181
mousePressEvent(QMouseEvent * event)182 void QKeyBoard::mousePressEvent(QMouseEvent *event)
183 {
184 if (event->button() == Qt::LeftButton) {
185 mousePressed = true;
186 mousePoint = event->globalPos() - this->pos();
187 event->accept();
188 }
189 }
190
mouseMoveEvent(QMouseEvent * event)191 void QKeyBoard::mouseMoveEvent(QMouseEvent *event)
192 {
193 if (mousePressed && event->buttons() == Qt::LeftButton) {
194 this->move(event->globalPos() - mousePoint);
195 event->accept();
196 }
197 }
198
mouseReleaseEvent(QMouseEvent *)199 void QKeyBoard::mouseReleaseEvent(QMouseEvent *)
200 {
201 mousePressed = false;
202 }
203