Russian Qt Forum
Май 06, 2024, 05:07 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Впорос по доставке сообщений QKeyEvent объектам в qml  (Прочитано 3230 раз)
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
Записан
Bepec
Гость
« Ответ #1 : Июль 11, 2016, 16:46 »

Эм. экранная клавиатура для своего приложения? а смысл тогда посылать евенты?

Тут скорее проблема в том, что вы посылаете нажатия сцене, а на деле нажатия надо посылать viewPort'у сцены. Но тут уже специфика QML, мб там не так. Ну а вдруг мой комментарий поможет Улыбающийся
Записан
James
Гость
« Ответ #2 : Июль 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, однако бесполезно. Вообще ради эксперимента куда я только не отправлял их, результат одинаковый.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.042 секунд. Запросов: 21.