Russian Qt Forum

Qt => Qt Quick => Тема начата: James от Июль 11, 2016, 14:26



Название: Впорос по доставке сообщений QKeyEvent объектам в qml
Отправлено: James от Июль 11, 2016, 14:26
Здравствуйте!
Нужно сделать простенькую цифровую экранную клавиатуру, для чего нужно генерировать сообщения нажатия кнопок клавиатуры. Сделал такой несложный метод:
Код:
void KeyEmitter::emitKey(Qt::Key key)
{
    QQuickWindow* receiver = qobject_cast<QQuickWindow*>(QGuiApplication::focusWindow());
    if(!receiver) {
        return;
    }
    QKeyEvent pressEvent = QKeyEvent(QEvent::KeyPress, key, Qt::NoModifier, QKeySequence(key).toString());
    QKeyEvent releaseEvent = QKeyEvent(QEvent::KeyRelease, key, Qt::NoModifier);
    QGuiApplication::sendEvent(receiver, &pressEvent);
    QGuiApplication::sendEvent(receiver, &releaseEvent);
}

Все сообщения доходят контролу у которого имеется фокус, но хотелось бы имитировать нажатия клавиши Tab. Tab перехватывается в TextField ( Keys.onTabPressed: console.log("tab") ) но Qt сцена никак не обрабатывает эти события и если нажать на клавишу Tab или стрелки, то курсор в TextField не будет перемещаться и фокус ввода не перейдет к другому контролу. Думаю, что вряд ли кто мне подскажет как это решить, но все таки решил сюда написать. Спасибо!
Qt 5.7 + MinGW32


Название: Re: Впорос по доставке сообщений QKeyEvent объектам в qml
Отправлено: Bepec от Июль 11, 2016, 16:46
Эм. экранная клавиатура для своего приложения? а смысл тогда посылать евенты?

Тут скорее проблема в том, что вы посылаете нажатия сцене, а на деле нажатия надо посылать viewPort'у сцены. Но тут уже специфика QML, мб там не так. Ну а вдруг мой комментарий поможет :)


Название: Re: Впорос по доставке сообщений QKeyEvent объектам в qml
Отправлено: James от Июль 11, 2016, 21:14
Event-ы удобны. Нажатие на клавише посылает сообщение любому контролу у которого есть фокус, причем контролы в этом смысле не зависят от того откуда пришли эти события - от реальной клавиатуры или от виртуальной.
По мануалу Qt при нажатии клавиши происходит следующее:

  • Qt receives the key action and generates a key event.
  • If a QQuickWindow is the active window, the key event is delivered to it.
  • The key event is delivered by the scene to the Item with active focus. If no item has active focus, the key event is ignored.
  • If the QQuickItem with active focus accepts the key event, propagation stops. Otherwise the event is sent to the Item's parent until the event is accepted, or the root item is reached.

Вот я и отдаю событие в QQuickWindow, однако бесполезно. Вообще ради эксперимента куда я только не отправлял их, результат одинаковый.