鍵盤事件(QKeyEvent)

這邊示範鍵盤事件的使用,用繼承自QWidget的自定義Widget元件,重載QWidget原本的QKeyEvent函式,使用者在按下相對的鍵盤或釋放時,此時相對的QLabel上會顯示已按下或釋放。

  • 範例有用到修飾鍵Ctrl(Qt::ControlModifier),Qt有定義多種修飾鍵,比如shift(Qt::ShiftModifier)等,實際使用時請參考相關文件。
  • 範例有用到按鍵Esc(Qt::Key_Escape),Qt有定義多種按鍵,比如Qt::Key_Up等,實際使用時請參考相關文件。

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QLabel>
#include <QVBoxLayout>
#include <QKeyEvent>

class Widget : public QWidget
{
    Q_OBJECT

public:
Widget(QWidget *parent = 0);
    void keyPressEvent(QKeyEvent *event);
    void keyReleaseEvent(QKeyEvent *event);
private:
    QLabel *escLabel;
    QLabel *ctrlVLabel;
    QLabel *releaseLabel;
    QVBoxLayout *mainLayout;
};

#endif 

widget.cpp

#include "widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent)
{
    setWindowTitle(tr("鍵盤事件"));
    escLabel = new QLabel(this);
    ctrlVLabel = new QLabel(this);
    releaseLabel = new QLabel(this);

    escLabel->setText(tr(""));
    ctrlVLabel->setText(tr(""));
    releaseLabel->setText(tr(""));

    escLabel->setAlignment(Qt::AlignCenter);     
    ctrlVLabel->setAlignment(Qt::AlignCenter);
    releaseLabel->setAlignment(Qt::AlignCenter);

    mainLayout = new QVBoxLayout(this);
    mainLayout->addWidget(escLabel);
    mainLayout->addWidget(ctrlVLabel);
    mainLayout->addWidget(releaseLabel);
}

void Widget::keyPressEvent(QKeyEvent *event){
    if(event->modifiers()==Qt::ControlModifier && event->key()==Qt::Key_V){
        ctrlVLabel->setText(tr("按下Ctrl+V"));
    }
    if(event->key()==Qt::Key_Escape){
        escLabel->setText(tr("按下Esc"));
    }
}

void Widget::keyReleaseEvent(QKeyEvent *event){
    releaseLabel->setText(tr("按鍵釋放"));
}

main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.resize(200,200);
    w.show();

    return a.exec();
}

QKeyEvent