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