[SOLVED] QML virtual keyboard + TextEdit
-
Hi all,
I'm attempting to build a virtual keyboard in my QML application (Qt 4.8.5 and QML 1.1).
What I really need is to simulate key events when pressing a key buttons of virtual keyboard.I searched online for some solutions but I don't find a clear one.
The solution most listed seems to be to create a custom c++ class (with an Invokable method) that should simulate the key press and release event.Surprisingly I did not find any example about it so I tried to build it but, into sendEvent call (bool QCoreApplication::sendEvent ( QObject * receiver, QEvent * event ) [static]), I don't know what set as receiver... or better I don't know how to pass the QML TextEdit "instance" as receiver.
How to do it?
Or otherwise there is another way to do it?Part of my class code:
@void KeyEmitter::simulateKey(QString keyName)
{
// getting selected keycode
Qt::Key keycode = _getKeyCodeFromName(keyName);
if ( keycode == Qt::Key_unknown )
{
#ifdef DEBUG_ENABLED
qDebug() << "Cannot resolve keycode associated to " << keyName;
#endif
return;
}QObject * receiver = NULL; // ??? if (keyName.length() == 1 && keyName[0].unicode() >= 'A' && keyName[0].unicode() <= 'Z') { QKeyEvent keyPressEvent(QEvent::KeyPress, keycode, Qt::ShiftModifier, keyName); QApplication::sendEvent(receiver, &keyPressEvent); QKeyEvent keyReleaseEvent(QEvent::KeyRelease, keycode, Qt::ShiftModifier, keyName); QApplication::sendEvent(receiver, &keyReleaseEvent); } else { QKeyEvent keyPressEvent(QEvent::KeyPress, keycode, Qt::NoModifier, keyName); QApplication::sendEvent(receiver, &keyPressEvent); QKeyEvent keyReleaseEvent(QEvent::KeyRelease, keycode, Qt::NoModifier, keyName); QApplication::sendEvent(receiver, &keyReleaseEvent); }
#ifdef DEBUG_ENABLED
qDebug() << "Simulated key " << qPrintable(keyName);
#endif
}@Thanks in advance
-
I found a similar issue with mouse event "in this post":http://stackoverflow.com/questions/7517700/how-to-simulate-mouse-clicks-in-qml
I tried to pass the viewer as receiver in my application and it works!
Summarizing....
Into main:
@int main(int argc, char *argv[])
{
[...]
QmlApplicationViewer viewer;
[...]
QScopedPointer<KeyEmitter> keyEmitter(new KeyEmitter(&viewer));
viewer.rootContext()->setContextProperty("keyEmitter", keyEmitter.data());
[...]
}@Into KeyEmitter class:
@class KeyEmitter : public QObject
{
Q_OBJECTpublic:
KeyEmitter*(QObject * receiver*, QObject * parent = NULL); // Added passing of receiver Q_INVOKABLE void simulateKey(QString keyName); [...]
private:
QObject * _receiver; [...]
};@
into QML:
@ IconButton // is an implementation of a "standard" button
{
id: abutton
text: "a"
onClicked: keyEmitter.simulateKey(text)
}@ -
One suggestion is that don't use the keyboard text directly. i.e 'A' or 'Z' etc. Use Qt::Key_A etc
-
Yes, I have done so.
@Qt::Key keycode = _getKeyCodeFromName(keyName);@
This function, given the keyName (for example 'a', 'z') returns the corresponding Qt::Key