Я настроил свое приложение для печати оператора отладки при нажатии 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 выходные данные отладки не отображаются.
Можете ли вы добавить ключевое слово override
, чтобы проверить, совпадает ли ваша подпись? В документации Qt последний аргумент имеет тип qintptr *result
, который может отличаться от long*
.
@pptaszni Использование переопределения в объявлении NativeEvent в mainwindow.h приводит к ошибке: невиртуальная функция-член с пометкой «переопределить» скрывает виртуальную функцию-член
@pptaszni Изменение его с long на qintptr привело к прогрессу. Теперь он реагирует на F7 и F8, однако при запуске приложения вывод заполняется сообщением «Получено сообщение:», несмотря на то, что ничего не нажимается.
Нажатия клавиш F7 и F8 — не единственные встроенные события... Приходится фильтровать.
Итак, я думаю, проблема решена? Вы не проверяете типы событий, поэтому ваш qDebug
будет срабатывать при каждом событии.
@pptaszni Это странно, это не так. При запуске приложения спамит "Полученное сообщение", потом останавливается. После этого он будет реагировать только на назначенные клавиши F7 и F8 и будет игнорировать все остальные нажатия клавиш. Если только эти родные события не являются нажатиями клавиш, и моя программа только после загрузки «реагирует» на события нажатия клавиш, соответствующие моим параметрам.
Отладьте его, проверьте, какие события фиксируются, распечатайте их сообщения и т. д. Возможно, это просто ожидаемое поведение от POV MS Windows.
@pptaszni Хорошая мысль, я могу взять это отсюда. Считайте, что проблема решена. Если хотите, можете опубликовать ответ, я проверю
Для 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;
Для тестирования я скопировал файлы: main.cpp, mainwindow.ui, mainwindow.h и mainwindow.cpp из этого репозитория: github.com/Onebeld/QuickAutoclicker/tree/master в НОВЫЙ QT Create. проект. Когда я создаю и нажимаю F8 и F7, он также не регистрирует нажатия клавиш. Однако их исполняемый файл работает отлично и регистрирует F7 и F8. Может ли это быть связано с тем, как я компилирую код в QT?