Я настроил свое приложение для печати оператора отладки при нажатии 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 выходные данные отладки не отображаются.
🤔 А знаете ли вы, что...
Язык C++ позволяет работать с указателями и адресами памяти, что требует осторожности при программировании.
Для 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;