Qkeyevent qt не работает

Qt keyPressEvent не регистрируется при нажатии клавиш W / A / S / D

У меня есть приложение (не относится ни к одной игре, где клавиши W / A / S / D могут иметь особые значения для навигации), где есть QFrame , Я преодолел keyPressEvent() чтобы получить текст, набираемый с клавиатуры, в то время как сосредоточиться на этом QFrame , Это мой код:

Когда я набираю символы с клавиатуры по одному, для всех символов и цифр оба оператора записываются правильно. Но для этих четырех ключей ни одна из инструкций журнала не выполняется, то есть обработчик событий даже не запускается. Что случилось?

Изменить: после прохождения примеров, я попытался сформировать минимальный рабочий пример моей ошибки. Это то, что у меня есть. Та же проблема здесь и с этим через фильтр событий. Только для тех четырех символов это не зарегистрировано.

Решение

Не уверен, что я что-то неправильно понимаю, но следующий код работает хорошо, и я вижу все ключи в журнале (даже заглавные), кроме ключа «w».

Здесь у вас есть:

Редактирование # 1: установил фильтр событий в QApplication, чтобы получить объекты, которые фильтруют события.

myframe.pro

main.cpp

myframe.h

myframe.cpp

Другие решения

QFrame Класс выполнен в виде простого каркасного объекта. Он не работает с любым входом по умолчанию. Таким образом, вы должны явно указать политику фокуса, которая позволяет получать события ввода с клавиатуры, используя QWidget::setFocusPolicy() метод. QFrame по умолчанию имеет Qt::NoFocus политика. Попробуйте установить рамки focus policy собственность на Qt::StrongFocus и запустите вашу программу снова.

Я нахожу тот факт, что клавиши W, A, S и D являются типичными клавишами перемещения игры, а также клавишами, с которыми у вас возникают проблемы, было очень подозрительным совпадением. Я думаю, у вас есть какая-то «игровая» клавиатура, расширение системы или пользовательский драйвер. Я думаю о таких вещах, как «виртуальный джойстик», «клавиши питания», программное обеспечение для виртуальной реальности, макропрограмма и т. Д. Я был бы более уверен в этом ответе, если бы это не происходило как на Mac, так и на ПК (если только Вы используете ту же клавиатуру или другое оборудование). В любом случае, я бы попробовал другую клавиатуру и запустил систему в безопасном режиме с другими закрытыми программами, просто чтобы убедиться, что эти ключевые события не перехватываются / не изменяются на системном уровне.

В качестве первого шага, пожалуйста, сделайте то, что сказал Meefte (приведите минимальный, полный и проверяемый пример «). Посмотрите, какие другие программы запущены. Вы уже проверили, что что-то блокирует это? Попробуйте свой код на другом компьютере или отключите любой инструмент, который вы установлен для вашей клавиатуры. Я думаю, что-то еще блокирует ваш ввод.
С наилучшими пожеланиями

Источник

Qt keyPressEvent не регистрируется при нажатии клавиш W/A/S/D

у меня есть приложение (не связанное с какой-либо игрой, где клавиши W/A/S/D могут иметь специальные значения для навигации), где есть QFrame . Я переехал keyPressEvent() чтобы получить текст, набираемый через клавиатуру, в то время как сосредоточиться на этом QFrame . Вот мой код:

когда я набираю символы с клавиатуры по одному для всех символов и чисел, оба оператора регистрируются правильно. Но для этих четырех ключей ни один из операторов log не выполняется, i.e мероприятие Хэндлер даже не стреляет. Что случилось?

Edit: после просмотра примеров я попытался сформировать минимальный рабочий пример моей ошибки. Вот что у меня есть. Такая же проблема здесь, а также с помощью фильтра событий. Только для этих четырех символов он не регистрируется.

Читайте также:  Кто настроит антенну триколор

4 ответов

не уверен, что я что-то неправильно понял, но следующий код работает хорошо, и я вижу все ключи в журнале (даже с заглавной буквы), кроме ключа «w».

Edit#1: установлен фильтр событий на QApplication, чтобы получить объекты, которые фильтруют события.

мой кадр.pro

main.cpp

myframe.h

myframe.cpp

QFrame класс разработан как простой объект фрейма. По умолчанию он не работает ни с каким входом. Поэтому вы должны явно specifify фокус политике, которая позволяет получать ввод с клавиатуры события, используя QWidget::setFocusPolicy() метод. QFrame по умолчанию Qt::NoFocus политика. Попробуйте установить focus policy свойство Qt::StrongFocus и снова запустите программу.

Я считаю, что ключи W, A, S и D являются типичными ключами движения игры, а также ключи, с которыми у вас возникли проблемы, чтобы быть очень подозрительным совпадением. Мое лучшее предположение, что у вас есть какая-то «игровая» клавиатура, системное расширение или пользовательский драйвер. Я думаю о таких вещах, как» виртуальный джойстик»,» клавиши питания», программное обеспечение VR, программное обеспечение macro и т. д. Я был бы более уверен в этом ответе, если бы это не происходило как на Mac, так и на ПК (если вы не используете ту же клавиатуру или другое оборудование). Любой я бы попробовал другую клавиатуру и запустил систему в безопасном режиме с закрытыми другими программами, чтобы убедиться, что эти ключевые события не перехватываются/не изменяются на системном уровне.

сначала сделайте то, что сказал Meefte (предоставьте минимальный, полный и проверяемый пример»). И взгляните на другие запущенные программы. Вы уже проверили, что что-то блокирует его? Попробуйте код на другом компьютере или деактивируйте любой инструмент, установленный для клавиатуры. Я думаю, что-то еще блокирует ваш вход. С наилучшими пожеланиями

Источник

Почему QKeyEvent не работает без окна?

Eсли я добавляю йункцию отлавливающую нажатие кнопки на клавиатуре:

В этот кусок кода :

Все работает хорошо, выводится все что я хочу, но если я хочу то же самое, но без создания окошка, то ничего не работает, ниже код без окна:

Вот, этот кусок кода не работает, как это можно поправить, может я вообще все нитак сделал? И второй вопрос: если я пишу отслеживание нажатий так:

print() пишет мне любую клавишу какую бы я не нажал, если я меняю if event.key() == Qt.Key_0 print() напиште только Key_0 . Почему так?

  • Вопрос задан более трёх лет назад
  • 456 просмотров

Вот тут очевидная ошибка:

if event.key() == Qt.Key_0 or Qt.Key_1:

Должно быть так:

if event.key() in [Qt.Key_0, Qt.Key_1]:

А с frame, по крайней мере, в том виде, как Вы написали, ничего работать не будеть, ведь этот класс не отнаследован от QmainWindow etc.

События в pyqt могут получать только унаследованные от QObject обьекты. Потому что внутри их кода и кода в библиотеках qt есть код который «посылает» сообщения и вызывает в объектах метод keyPressEvent . Вы же создаёте новый класс Frame и не унаследуете для него никакие Qt-шные функции. Поэтому функция keyPressEvent не будет в нём вызвана никогда.
Это ответ на вопрос «почему». а вот ответить как сделать правильно на Qt я не могу.

Однако могу посоветовать копать в сторону сторонней библиотеке keyboard которая в принципе может и без Qt:

Источник

Qt keyPressEvent не регистрируется при нажатии кнопок W/A/S/D

У меня есть приложение (не связанное с какой-либо игрой, где ключи W/A/S/D могут иметь специальные значения для навигации), где есть QFrame . Я перепробовал keyPressEvent() , чтобы получить текст, набираемый с клавиатуры, в то время как он фокусируется на QFrame . Это мой код:

Когда я ввожу символы с клавиатуры по одному, для всех символов и чисел оба оператора регистрируются правильно. Но для этих четырех ключей ни один из операторов журнала не выполняется, т.е. Обработчик событий даже не стреляет. Что не так?

Изменить: после прохождения примеров я попытался сформировать минимальный рабочий пример моей ошибки. Это то, что у меня есть. Та же проблема здесь, а также с помощью фильтра событий. Только для этих четырех символов он не регистрируется.

Читайте также:  Почему не работает вторая линия мегафон

Не уверен, что я что-то не понимаю, но следующий код работает хорошо, и я вижу все ключи в журнале (даже заглавные), кроме ключа «w».

Здесь у вас есть:

Изменить # 1: установить фильтр событий в QApplication, чтобы получить объекты, которые фильтруют события.

myframe.pro

main.cpp

myframe.h

myframe.cpp

QFrame класс разработан как простой объект кадра. По умолчанию он не работает с любым вводом. Поэтому вы должны явно указать политику фокусировки, которая позволяет извлекать события ввода клавиатуры с использованием метода QWidget::setFocusPolicy() . QFrame по умолчанию имеет политику Qt::NoFocus . Попробуйте установить свойство focus policy для рамки Qt::StrongFocus и снова запустите свою программу.

Я нахожу факт, что ключи W, A, S и D являются типичными клавишами движения игры, а также ключами, с которыми вы сталкиваетесь, с очень подозрительным совпадением. Мое лучшее предположение: у вас есть какая-то «игровая» клавиатура, расширение системы или пользовательский драйвер. Я думаю о таких вещах, как «виртуальный джойстик», «силовые ключи», программное обеспечение VR, программное обеспечение для макросов и т.д. Я был бы уверен в этом ответе, если бы это не происходило как на Mac, так и на ПК (кроме вы используете ту же клавиатуру или другое оборудование). В любом случае я бы попробовал другую клавиатуру и запустил систему в безопасном режиме с закрытыми другими программами, чтобы убедиться, что эти ключевые события не перехватываются/не изменяются на системном уровне.

Как сначала, пожалуйста, сделайте то, что сказал Meefte (укажите минимальный, полный и проверенный пример). Посмотрите на свои другие запущенные программы. Вы уже убедились, что что-то блокирует его? Попробуйте использовать свой код на другом компьютере или деактивируйте любой инструмент, который вы установили для своей клавиатуры. Я предполагаю, что что-то еще блокирует ваш вход.
С наилучшими пожеланиями

Источник

Qt Documentation

Contents

The QKeyEvent class describes a key event. More.

Header: #include
qmake: QT += gui
Inherits: QInputEvent

Public Functions

QKeyEvent(QEvent::Type type, int key, Qt::KeyboardModifiers modifiers, quint32 nativeScanCode, quint32 nativeVirtualKey, quint32 nativeModifiers, const QString &text = QString(), bool autorep = false, ushort count = 1)
QKeyEvent(QEvent::Type type, int key, Qt::KeyboardModifiers modifiers, const QString &text = QString(), bool autorep = false, ushort count = 1)
int count() const
bool isAutoRepeat() const
int key() const
bool matches(QKeySequence::StandardKey key) const
Qt::KeyboardModifiers modifiers() const
quint32 nativeModifiers() const
quint32 nativeScanCode() const
quint32 nativeVirtualKey() const
QString text() const

Detailed Description

Key events are sent to the widget with keyboard input focus when keys are pressed or released.

A key event contains a special accept flag that indicates whether the receiver will handle the key event. This flag is set by default for QEvent::KeyPress and QEvent::KeyRelease, so there is no need to call accept() when acting on a key event. For QEvent::ShortcutOverride the receiver needs to explicitly accept the event to trigger the override. Calling ignore() on a key event will propagate it to the parent widget. The event is propagated up the parent widget chain until a widget accepts it or an event filter consumes it.

The QWidget::setEnabled() function can be used to enable or disable mouse and keyboard events for a widget.

Member Function Documentation

QKeyEvent:: QKeyEvent ( QEvent::Type type, int key, Qt::KeyboardModifiers modifiers, quint32 nativeScanCode, quint32 nativeVirtualKey, quint32 nativeModifiers, const QString &text = QString(), bool autorep = false, ushort count = 1)

Constructs a key event object.

Int key is the code for the Qt::Key that the event loop should listen for. If key is 0, the event is not a result of a known key; for example, it may be the result of a compose sequence or keyboard macro. The modifiers holds the keyboard modifiers, and the given text is the Unicode text that the key generated. If autorep is true, isAutoRepeat() will be true. count is the number of keys involved in the event.

In addition to the normal key event data, also contains nativeScanCode, nativeVirtualKey and nativeModifiers. This extra data is used by the shortcut system, to determine which shortcuts to trigger.

Читайте также:  После смены экрана не работает face id

QKeyEvent:: QKeyEvent ( QEvent::Type type, int key, Qt::KeyboardModifiers modifiers, const QString &text = QString(), bool autorep = false, ushort count = 1)

Constructs a key event object.

Int key is the code for the Qt::Key that the event loop should listen for. If key is 0, the event is not a result of a known key; for example, it may be the result of a compose sequence or keyboard macro. The modifiers holds the keyboard modifiers, and the given text is the Unicode text that the key generated. If autorep is true, isAutoRepeat() will be true. count is the number of keys involved in the event.

int QKeyEvent:: count () const

Returns the number of keys involved in this event. If text() is not empty, this is simply the length of the string.

bool QKeyEvent:: isAutoRepeat () const

Returns true if this event comes from an auto-repeating key; returns false if it comes from an initial key press.

Note that if the event is a multiple-key compressed event that is partly due to auto-repeat, this function could return either true or false indeterminately.

int QKeyEvent:: key () const

Returns the code of the key that was pressed or released.

See Qt::Key for the list of keyboard codes. These codes are independent of the underlying window system. Note that this function does not distinguish between capital and non-capital letters, use the text() function (returning the Unicode text the key generated) for this purpose.

A value of either 0 or Qt::Key_unknown means that the event is not the result of a known key; for example, it may be the result of a compose sequence, a keyboard macro, or due to key event compression.

bool QKeyEvent:: matches ( QKeySequence::StandardKey key) const

Returns true if the key event matches the given standard key; otherwise returns false .

This function was introduced in Qt 4.2.

Qt::KeyboardModifiers QKeyEvent:: modifiers () const

Returns the keyboard modifier flags that existed immediately after the event occurred.

Warning: This function cannot always be trusted. The user can confuse it by pressing both Shift keys simultaneously and releasing one of them, for example.

quint32 QKeyEvent:: nativeModifiers () const

Returns the native modifiers of a key event. If the key event does not contain this data 0 is returned.

Note: The native modifiers may be 0, even if the key event contains extended information.

This function was introduced in Qt 4.2.

quint32 QKeyEvent:: nativeScanCode () const

Returns the native scan code of the key event. If the key event does not contain this data 0 is returned.

Note: The native scan code may be 0, even if the key event contains extended information.

Note: On macOS, this function is not useful, because there is no way to get the scan code from the system APIs. The function always returns 1 (or 0 in the case explained above).

This function was introduced in Qt 4.2.

quint32 QKeyEvent:: nativeVirtualKey () const

Returns the native virtual key, or key sym of the key event. If the key event does not contain this data 0 is returned.

Note: The native virtual key may be 0, even if the key event contains extended information.

This function was introduced in Qt 4.2.

QString QKeyEvent:: text () const

Returns the Unicode text that this key generated.

Return values when modifier keys such as Shift, Control, Alt, and Meta are pressed differ among platforms and could return an empty string.

Note: key() will always return a valid value, independent of modifier keys.

В© 2021 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.

Источник

Оцените статью