Почему NativeEvent не регистрирует нажатия клавиш?

Я настроил свое приложение для печати оператора отладки при нажатии F8 или F7 на клавиатуре. Однако nativeEvent, похоже, не воспринимает ввод с клавиатуры, почему?

фрагмент mainwindow.cpp:

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QKeySequence defaultKeySequence("F9");
    ui->keySequenceEdit->setKeySequence(defaultKeySequence);

    registerHotKey(100, 0, VK_F8);
    registerHotKey(101, 0, VK_F7);

}


bool MainWindow::registerHotKey(int id, int modifiers, int key) {
    if (!RegisterHotKey((HWND)MainWindow::winId(), id, modifiers, key)) {
        qDebug() << "Failed to register hotkey with ID:" << id;
        return false;
    }
    qDebug() << "Registered hotkey with ID:" << id;
    return true;
}


bool MainWindow::nativeEvent(const QByteArray &eventType, void *message, long *result){
    Q_UNUSED(eventType);
    Q_UNUSED(result);
    qDebug() << "Received message:";
    return false;
}

фрагмент mainwindow.h:

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();


    Ui::MainWindow *getUi() const;


protected:
    bool nativeEvent(const QByteArray &eventType, void *message, long *result);

private slots:
    // Stuff

private:
    Ui::MainWindow *ui;
};

После запуска приложения выходные данные дают:

STARTING APPLICATION!
Hotkey changed to:  QKeySequence("F9")
Registered hotkey with ID: 100
Registered hotkey with ID: 101

При нажатии F8 и F7 выходные данные отладки не отображаются.

Для тестирования я скопировал файлы: main.cpp, mainwindow.ui, mainwindow.h и mainwindow.cpp из этого репозитория: github.com/Onebeld/QuickAutoclicker/tree/master в НОВЫЙ QT Create. проект. Когда я создаю и нажимаю F8 и F7, он также не регистрирует нажатия клавиш. Однако их исполняемый файл работает отлично и регистрирует F7 и F8. Может ли это быть связано с тем, как я компилирую код в QT?

Alan Shiah 11.06.2024 10:12

Можете ли вы добавить ключевое слово override, чтобы проверить, совпадает ли ваша подпись? В документации Qt последний аргумент имеет тип qintptr *result, который может отличаться от long*.

pptaszni 11.06.2024 11:00

@pptaszni Использование переопределения в объявлении NativeEvent в mainwindow.h приводит к ошибке: невиртуальная функция-член с пометкой «переопределить» скрывает виртуальную функцию-член

Alan Shiah 11.06.2024 11:16

@pptaszni Изменение его с long на qintptr привело к прогрессу. Теперь он реагирует на F7 и F8, однако при запуске приложения вывод заполняется сообщением «Получено сообщение:», несмотря на то, что ничего не нажимается.

Alan Shiah 11.06.2024 11:19

Нажатия клавиш F7 и F8 — не единственные встроенные события... Приходится фильтровать.

Nelfeal 11.06.2024 11:25

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

pptaszni 11.06.2024 11:27

@pptaszni Это странно, это не так. При запуске приложения спамит "Полученное сообщение", потом останавливается. После этого он будет реагировать только на назначенные клавиши F7 и F8 и будет игнорировать все остальные нажатия клавиш. Если только эти родные события не являются нажатиями клавиш, и моя программа только после загрузки «реагирует» на события нажатия клавиш, соответствующие моим параметрам.

Alan Shiah 11.06.2024 11:32

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

pptaszni 11.06.2024 11:43

@pptaszni Хорошая мысль, я могу взять это отсюда. Считайте, что проблема решена. Если хотите, можете опубликовать ответ, я проверю

Alan Shiah 11.06.2024 11:47
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
9
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для Qt6 подпись переопределяемого метода:

bool QWidget::nativeEvent(const QByteArray &eventType, void *message, qintptr *result)

Если на вашей платформе std::is_same_v<qintptr, long> есть false, то вы перегружаете или затеняете метод вместо того, чтобы переопределить его. Чтобы избежать подобных ошибок, рекомендуется использовать ключевое слово override:

// this will result in compilation error:
bool nativeEvent(const QByteArray &eventType, void *message, long *result) override;

Другие вопросы по теме