Хобрук: Ваш путь к мастерству в программировании

Обработка ключевых событий Ctrl+Tab и Ctrl+Shift+Tab

Я хочу обработать два ключевых события Ctrl+Tab и Ctrl+Shift+Tab, чтобы переключаться между вкладками в моем приложении ("вперед" и "назад" соответственно). Однако, похоже, это работает не так, как ожидалось.

Это мой текущий код (минимальный пример):

import QtQuick 1.1

Item {
    width: 100
    height: 100

    focus: true

    Keys.onPressed: {
        if(event.modifiers & Qt.ControlModifier) {
            if(event.key === Qt.Key_Tab) {
                if(event.modifiers & Qt.ShiftModifier)
                    console.log('backward')
                else
                    console.log('forward')
            }
        }
    }
}

Я запустил этот фрагмент кода с qmlviewer (версия Qt 4.8.2)

Вывод при нажатии Ctrl+Tab:

forward
forward

Вывод при нажатии Ctrl+Shift+Tab:

нет

Итак, я вижу две ошибки: первая последовательность клавиш обрабатывается дважды, а другая - нет.

  • EDIT: Причина, по которой другой вообще не обрабатывается, устранена, см. комментарии.

Почему это происходит и как я могу это решить?

Примечание. Я уже использую Qt Components for Desktop в своем приложении, так что ничего страшного, если вы знаете решение, требующее этого модуля.


  • Хорошо, я думаю, проблема в том, что Qt уже отображает Shift+Tab в Qt::Key_Backtab вместо Qt::Key_Tab. Это решает вторую проблему, но не проблему получения ключевых событий дважды. 11.10.2012

Ответы:


1

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

Item {
    width: 100
    height: 100

    focus: true

    Keys.onPressed: {
        if(event.modifiers && Qt.ControlModifier) {
            if(event.key === Qt.Key_Tab) {
                console.log('forward')
                event.accepted = true;
            }
            else if(event.key === Qt.Key_Backtab) {
                console.log('backward')
                event.accepted = true;
            }
        }
    }
}

Редактировать. Это поведение позволяет родителям обрабатывать события, недоступные ребенку, например горячие клавиши.

Надеюсь это поможет!

10.11.2012
  • У вас ошибка в коде, event.modifiers && Qt.ControlModifier должно быть event.modifiers == Qt.ControlModifier. В противном случае вторые ключевые события будут работать в сочетании с любыми event.modifiers 23.12.2014
  • Новые материалы

    Прогресс в технологии Трансформеров часть 3
    Многомасштабный управляющий сигнальный преобразователь для бесфазного синтеза движения (arXiv) Автор: Линтао Ван , Кун Ху , Лей Бай , Юй Дин , Ваньли Оуян , Чжиюн Ван . Аннотация:..

    Представляем поддержку компонентов Vue.js. Мгновенный HMR и многое другое.
    Хотя у FuseBox уже был плагин Vue, он был базовым и не имел многих функций, которые делали работу с Vue.js такой приятной. Однако с этим выпуском мы рады сообщить, что в FuseBox..

    Приключения в Javascript, часть 1
    Я продолжаю думать о том, чтобы писать больше, но чем больше я думаю об этом, тем меньше я это делаю. Итак, сегодня я перестал думать и начал писать. Отсюда можно только спускаться… В..

    Понимание дженериков в TypeScript: подробное руководство
    Введение TypeScript, строго типизированный надмножество JavaScript, хорошо известен своей способностью улучшать масштабируемость, удобочитаемость и ремонтопригодность приложений. Одной из..

    Учебные заметки JavaScript Object Oriented Labs
    Вот моя седьмая неделя обучения программированию. После ruby ​​и его фреймворка rails я начал изучать самый популярный язык интерфейса — javascript. В отличие от ruby, javascript — это более..

    Разбор строк запроса в vue.js
    Иногда вам нужно получить данные из строк запроса, в этой статье показано, как это сделать. В жизни каждого дизайнера/разработчика наступает момент, когда им необходимо беспрепятственно..

    Предсказание моей следующей любимой книги 📚 Благодаря данным Goodreads и машинному обучению 👨‍💻
    «Если вы не любите читать, значит, вы не нашли нужную книгу». - J.K. Роулинг Эта статья сильно отличается от тех, к которым вы, возможно, привыкли . Мне очень понравилось поработать над..