前言:
本文操作均为在vs2015+QT5.9.5版本中执行
头文件:qeventtest.h
#pragma once
#include <QtWidgets/QWidget>
#include "ui_qeventtest.h"
class QEventTest : public QWidget
{
Q_OBJECT
public:
QEventTest(QWidget *parent = Q_NULLPTR);
//重载事件函数
bool event(QEvent *ev);
//重载键盘按下事件
void keyPressEvent(QKeyEvent *ev);
//重载键盘松开事件
void keyReleaseEvent(QKeyEvent *ev);
private:
Ui::QEventTestClass ui;
};
UI文件:qeventtest.ui
/********************************************************************************
** Form generated from reading UI file 'qeventtest.ui'
**
** Created by: Qt User Interface Compiler version 5.9.5
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/
#ifndef UI_QEVENTTEST_H
#define UI_QEVENTTEST_H
#include <QtCore/QVariant>
#include <QtWidgets/QAction>
#include <QtWidgets/QApplication>
#include <QtWidgets/QButtonGroup>
#include <QtWidgets/QHeaderView>
#include <QtWidgets/QLabel>
#include <QtWidgets/QWidget>
QT_BEGIN_NAMESPACE
class Ui_QEventTestClass
{
public:
QLabel *label;
void setupUi(QWidget *QEventTestClass)
{
if (QEventTestClass->objectName().isEmpty())
QEventTestClass->setObjectName(QStringLiteral("QEventTestClass"));
QEventTestClass->resize(961, 608);
label = new QLabel(QEventTestClass);
label->setObjectName(QStringLiteral("label"));
label->setGeometry(QRect(210, 170, 531, 301));
label->setStyleSheet(QString::fromUtf8("background-color: rgb(0, 255, 255);\n"
"font: 28pt \"\351\273\221\344\275\223\";"));
label->setAlignment(Qt::AlignCenter);
retranslateUi(QEventTestClass);
QMetaObject::connectSlotsByName(QEventTestClass);
} // setupUi
void retranslateUi(QWidget *QEventTestClass)
{
QEventTestClass->setWindowTitle(QApplication::translate("QEventTestClass", "QEventTest", Q_NULLPTR));
label->setText(QApplication::translate("QEventTestClass", "\346\226\207\346\234\254\346\265\213\350\257\225", Q_NULLPTR));
} // retranslateUi
};
namespace Ui {
class QEventTestClass: public Ui_QEventTestClass {};
} // namespace Ui
QT_END_NAMESPACE
#endif // UI_QEVENTTEST_H
主函数:main.cpp
#include "qeventtest.h"
#include <QtWidgets/QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QEventTest w;
w.show();
return a.exec();
}
实现文件:qeventtest.cpp
#include "qeventtest.h"
#include <QDebug>
#include <QEvent>
#include <QKeyEvent>
QEventTest::QEventTest(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
//this->setMouseTracking(true);
}
//QEvent类是所有事件类的基类。事件对象包含事件参数
bool QEventTest::event(QEvent *ev)
{
#if 0
qDebug() << ev->type();//打印类型
子节点不会响应事件
return false;
所有事件对象都会响应
return QWidget::event(ev);
#endif //重载QEvent响应事件测试
#if 0
//键盘事件
//判断键盘是否按下,键盘按下任意按钮打印
if (ev->type() == QEvent::KeyPress)
{
//强转为子类QKeyEvent获取按钮信息
QKeyEvent *ke = static_cast<QKeyEvent*>(ev);
//打印按下按钮的名字,打印的是ASCII值需要转换为char变成“英文”
qDebug() << "KeyPress =" << (char)ke->key();
return true;
}
return QWidget::event(ev);//激活QWidget里控件的所有事件
#endif //键盘事件测试
//判断键盘是否按下
if (ev->type() == QEvent::KeyPress)
{
//强转为子类QKeyEvent获取按钮信息
QKeyEvent *ke = static_cast<QKeyEvent*>(ev);
//判断键盘是否按下‘A’(PS:不分大小写);
//按键按下判断结束后,剩下的事件由下面的“按键松开事件”接着继续处理
if(ke->key() == 'A')
{
//自动连续事件不处理
//if (!ke->isAutoRepeat())
qDebug() << "aaaaaaaaaaaaaaaaaaaaaaaaa";
//return true;//返回为true(PS:代表处理完了,处理下一个事件)
//测试效果和return true;基本一样没发现什么不同
return false;//返回为false(PS:代表本事件事件处理完,下一个事件可以接着进行处理)
}
}
return QWidget::event(ev);
}
void QEventTest::keyPressEvent(QKeyEvent *ev)
{
//检查是否重复按下
if (ev->isAutoRepeat()) return;
if (ev->key() == Qt::Key_F1)
{
qDebug() << "Key_F1";
}
qDebug() << "keyPressEvent" << ev->key();
}
void QEventTest::keyReleaseEvent(QKeyEvent *ev)
{
//检查是否重复松开
if (ev->isAutoRepeat()) return;
qDebug() << "keyReleaseEvent" << ev->key();
}