widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QEvent>
#include <QMouseEvent> //鼠标事件
#include <QKeyEvent> //键盘事件
#include <QWheelEvent> //滚轮事件
#include <QTimerEvent> //定时器事件
#include <QPaintEvent> //绘图事件
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
//事件处理统一入口
bool event(QEvent *event);
//特定事件处理器
//鼠标的特定事件处理器
void mousePressEvent(QMouseEvent *event); //点击
void mouseReleaseEvent(QMouseEvent *event); //松开
void mouseMoveEvent(QMouseEvent *event); //移动
void mouseDoubleClickEvent(QMouseEvent *event); //双击
//键盘的特定事件处理器
void keyPressEvent(QKeyEvent *event);
void keyReleaseEvent(QKeyEvent *event);
//鼠标滚轮的特定事件处理
void wheelEvent(QWheelEvent *event);
//超时事件
void timerEvent(QTimerEvent *event);
//绘图事件
void paintEvent(QPaintEvent *event);
//进入,退出事件
void enterEvent(QEvent *event);
void leaveEvent(QEvent *event);
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
//每一个QWidget都有一个自己的定时器,启动超时后会产生超时事件
startTimer(5000); //是不断重复的,每隔5秒执行定时器函数中的内容
}
Widget::~Widget()
{
}
//事件处理的主入口函数
bool Widget::event(QEvent *event)
{
if(event->type() == QEvent::KeyPress)
{
qDebug() << "Widget::event(),键盘按下的事件";
}
else if(event->type() == QEvent::MouseButtonPress)
{
qDebug() << "Wifget::event(),鼠标事件";
}
else if(event->type() == QEvent::Wheel)
{
qDebug() << "Widget::event(),滚轮事件";
}
//如果是不感兴趣的事件,交给父类的事件处理器处理
QWidget::event(event);
}
//特定事件处理器
void Widget::mousePressEvent(QMouseEvent *event) //点击
{
qDebug() << "mousePressEvent(),鼠标单击按下";
if(event->button() == Qt::LeftButton)
{
qDebug() << "这是鼠标左键";
}
else
{
qDebug() << "这是鼠标右键";
}
//事件发生时鼠标在widget中的位置
qDebug() << event->pos();
qDebug() << event->x();
qDebug() << event->y();
//事件发生时鼠标在整个电脑屏幕中的位置
qDebug() << event->globalPos();
qDebug() << event->globalX();
qDebug() << event->globalY();
}
void Widget::mouseReleaseEvent(QMouseEvent *event) //松开
{
qDebug() << "mouseReleaseEvent(),鼠标单击释放";
qDebug() << event->pos();
}
void Widget::mouseMoveEvent(QMouseEvent *event) //移动
{
qDebug() << "mouseMOveEvent(),鼠标移动";
qDebug() << event->pos();
}
void Widget::mouseDoubleClickEvent(QMouseEvent *event) //双击
{
qDebug() << "mouseDoubleClickEvent(),鼠标双击";
qDebug() << event->pos();
}
void Widget::keyPressEvent(QKeyEvent *event)
{
qDebug() << "keyPressEvent(),键盘的按下";
qDebug() << (char)event->key();
}
void Widget::keyReleaseEvent(QKeyEvent *event)
{
qDebug() << "keyReleaseEvent(),键盘的松开";
qDebug() << (char)event->key();
}
void Widget::wheelEvent(QWheelEvent *event)
{
qDebug() << "wheelEvent(),滚轮的事件";
qDebug() << event->delta(); //移动的方向,向上为正值,向下为负值
}
void Widget::timerEvent(QTimerEvent *event)
{
qDebug() << "timerEvent(),超时事件";
static int i = 0;
if(i++%5 == 0)
{
this->hide();
}
else
{
this->show();
}
//this->update(); //让eidget窗口重新绘制,更新
}
void Widget::paintEvent(QPaintEvent *event)
{
qDebug() << "paintEvent(),绘图事件";
}
void Widget::enterEvent(QEvent *event)
{
qDebug() << "enterEvent(),进入事件";
}
void Widget::leaveEvent(QEvent *event)
{
qDebug() << "leaveEvent(),离开事件";
}
main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
结果