I currently repairing some bugs on the Directory System.
This system has a Webview panel and also a virtual keyboard.
This system was developed by using QML, Javascript and 1% of C++.
The virtual keyboard has error in the codes.
I entered lower case 'a',in the website textbox it will appear as upper-case'A'. And this happen to all the character from A to Z.
And
another problem is when I entered Symbols, there will be weird character appearing in the textbox.
Here below source from Event Panel
QML
file.
WebKeyboardPad
{
id: keyboard
x: 0
y: event_panel.height + keyboard.height;
anchors.horizontalCenter: parent.horizontalCenter
onClicked: Globals.onKeyboardClicked(tag);
onBackspace: Globals.onKeyboardBackspace();
opacity: 1
Behavior on y
{
id: behavior_nb_keyboard_y
enabled: keyboard.isDragging
NumberAnimation { duration: 300; }
}
Behavior on opacity
{
NumberAnimation { duration: 300; }
}
}
This source is from a
JavaScript
file;
function onKeyboardClicked(keyName)
{
home_main.onKeyboardClicked(keyName);
}
function onKeyboardBackspace()
{
home_main.onKeyboardClicked("backspace");
}
This from Main
QML
file
HardwareInfo
{
id: syshardware
}
function onKeyboardClicked(Keys)
{
myKeyboard.simulateKey(Keys);
}
function onKeyboardBackspace(KeyNavigation)
{
myKeyboard.simulateKey(KeyNavigation);
}
Here the last one is the C++ file
keyboard.cpp
I got change the
keyboard.cpp file but when I try which the c++ code change, the result still the same.
#include "keyboard.h"
#include <qevent>
#include <qkeyevent>
#include <qapplication>
Keyboard::Keyboard(QObject *parent) : QObject(parent)
{
theWidget = NULL;
}
void Keyboard::setWidget(QWidget* theWidget)
{
this->theWidget = theWidget;
}
void Keyboard::simulateKey(QString keyName)
{
Qt::Key keycode = getKeyCodeFromName(keyName);
if (keycode == Qt::Key_unknown || this->theWidget == NULL)
return;
if (keyName.length() == 1 && keyName[0].unicode() >= 'A' && keyName[0].unicode() <= 'Z')
{
QKeyEvent keyPressEvent(QEvent::KeyPress, keycode, Qt::ShiftModifier);
QApplication::sendEvent(this->theWidget, &keyPressEvent);
QKeyEvent keyReleaseEvent(QEvent::KeyRelease, keycode, Qt::ShiftModifier);
QApplication::sendEvent(this->theWidget, &keyReleaseEvent);
}
else
{
QKeyEvent keyPressEvent(QEvent::KeyPress, keycode, Qt::NoModifier);
QApplication::sendEvent(this->theWidget, &keyPressEvent);
QKeyEvent keyReleaseEvent(QEvent::KeyRelease, keycode, Qt::NoModifier);
QApplication::sendEvent(this->theWidget, &keyReleaseEvent);
}
qDebug("Simulating key: %s", qPrintable(keyName));
}
Qt::Key Keyboard::getKeyCodeFromName(QString keyname)
{
keyname = keyname.toLower();
if (keyname.length() < 1)
return Qt::Key_unknown;
if (keyname == "left") return Qt::Key_Left;
else if (keyname == "right") return Qt::Key_Right;
else if (keyname == "up") return Qt::Key_Up;
else if (keyname == "down") return Qt::Key_Down;
else if (keyname == "center") return Qt::Key_Enter;
else if (keyname == "enter") return Qt::Key_Enter;
else if (keyname == "tab") return Qt::Key_Tab;
else if (keyname == "\n") return Qt::Key_Enter;
else if (keyname == "cpanel") return Qt::Key_PageUp;
else if (keyname == "widget") return Qt::Key_PageDown;
else if (keyname == "pgup") return Qt::Key_PageUp;
else if (keyname == "pgdown") return Qt::Key_PageDown;
else if (keyname == "pageup") return Qt::Key_PageUp;
else if (keyname == "pagedown") return Qt::Key_PageDown;
else if (keyname == "esc") return Qt::Key_Escape;
else if (keyname == "del") return Qt::Key_Delete;
else if (keyname == "delete") return Qt::Key_Delete;
else if (keyname == "backspace") return Qt::Key_Backspace;
else if (keyname == "space") return Qt::Key_Space;
else if (keyname == " ") return Qt::Key_Space;
else if (keyname == "+") return Qt::Key_Plus;
else if (keyname == "-") return Qt::Key_Minus;
else if (keyname == "*") return Qt::Key_Asterisk;
else if (keyname == "/") return Qt::Key_Slash;
else if (keyname == "\\") return Qt::Key_Backslash;
else if (keyname == ".") return Qt::Key_Period;
else if (keyname == ",") return Qt::Key_Comma;
else if (keyname == "?") return Qt::Key_Question;
else if (keyname == "<") return Qt::Key_Less;
else if (keyname == ">") return Qt::Key_Greater;
else if (keyname == "=") return Qt::Key_Equal;
else if (keyname == "@") return Qt::Key_At;
else if (keyname == "!") return Qt::Key_Exclam;
else if (keyname == "%") return Qt::Key_Percent;
else if (keyname == "$") return Qt::Key_Dollar;
else if (keyname == ":") return Qt::Key_Colon;
else if (keyname == ";") return Qt::Key_Semicolon;
else if (keyname == "(") return Qt::Key_BracketLeft;
else if (keyname == ")") return Qt::Key_BracketRight;
else if (keyname == "{") return Qt::Key_BraceLeft;
else if (keyname =&&&&= "}") return Qt::Key_BraceRight;
else if (keyname == "\"") return Qt::Key_QuoteDbl;
else if (keyname == "volup") return Qt::Key_VolumeUp;
else if (keyname == "voldown") return Qt::Key_VolumeDown;
else if (keyname == "mute") return Qt::Key_VolumeMute;
else if (keyname == "search") return Qt::Key_Search;
else if (keyname == "menu") return Qt::Key_Menu;
else if (keyname.length() >= 2)
{
if (keyname.startsWith('f'))
{
bool convertOK = false;
keyname = keyname.right(keyname.length()-1);
int findex = keyname.toInt(&convertOK);
if (convertOK)
return (Qt::Key)(Qt::Key_F1 + (findex-1));
}
}
else
{
if (keyname[0].unicode() >= 'a' && keyname[0].unicode() <= 'z')
return (Qt::Key)(Qt::Key_A + keyname[0].unicode() - 'a');
if (keyname[0].unicode() >= 'A' && keyname[0].unicode() <= 'Z')
return (Qt::Key)(Qt::Key_A + keyname[0].unicode() - 'A');
if (keyname[0].unicode() >= '0' && keyname[0].unicode() <= '9')
return (Qt::Key)(Qt::Key_0 + keyname[0].unicode() - 'a');
}
return Qt::Key_unknown;
}
keyboard.h
#ifndef KEYBOARD_H
#define KEYBOARD_H
#include <QObject>
#include <QWidget>
class Keyboard : public QObject
{
Q_OBJECT
public:
Keyboard(QObject *parent = NULL);
void setWidget(QWidget*);
Q_INVOKABLE void simulateKey(QString keyName);
private:
QWidget* theWidget;
Qt::Key getKeyCodeFromName(QString keyname);
};
#endif // KEYBOARD_H
I have change the cpp file but it still does not work.
Hopefully someone can help me to solve this problem.
Thank you