天天看点

Qt开发之事件简单罗列介绍

先简单说一下事件这个概念吧, 事件就是在应用界面的一个动作,可以是点击鼠标或者滑动鼠标等等一系列可以想象得到的操作

事件处理过程:  

QApplication::exec() //主事件循环,检测是否有事件产生   一旦有事件产生,就会产生一个事件对象  

1)在Qt内部,Qt通过QApplication::exec()启动的主事件循环不停的抓取事件队列中的事件  

2)当事件发生时,Qt将创建一个事件对象。Qt中所有的事件类都继承自QEvent  

3)在事件对象创建完毕后,Qt将这个事件传递给QObject的event()函数。event()函数并不直接处理事件,   而是按照事件对象的类型分派给特定的事件处理函数(event handler)。  

event()函数主要用于事件的分发:

之前单独写了鼠标事件,还是想了一下一起罗列出来吧

事件有以下几种:

1)鼠标事件:鼠标点击,鼠标双击, 鼠标点击移动,鼠标释放(放开)

2)滚轮事件:指的是鼠标的滚轮拖动的事件

3)键盘事件:键盘按下,键盘释放

4)窗口改变大小事件

5)进入/离开事件:鼠标进入或者移出界面发生的事件

来通过代码学习吧

widget.h文件

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();

protected:
    void mousePressEvent(QMouseEvent *event);//鼠标点击事件
    void mouseMoveEvent(QMouseEvent *event);//鼠标点击移动事件,键按下拖动鼠标变化的
    void mouseDoubleClickEvent(QMouseEvent *event);//鼠标双击事件
    void mouseReleaseEvent(QMouseEvent *event);//鼠标释放事件

    void wheelEvent(QWheelEvent *event);//滚轮事件

    void keyPressEvent(QKeyEvent *event); //键盘按下事件
    void keyReleaseEvent(QKeyEvent *event); //键盘抬起事件

    void resizeEvent(QResizeEvent *event); //窗口大小改变事件

    void enterEvent(QEvent *event); //鼠标进入界面事件
    void leaveEvent(QEvent *event); //鼠标离开界面事件

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H
           

widget.cpp文件

#include "widget.h"
#include "ui_widget.h"
#include <QMouseEvent>
#include <QDebug>
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::mousePressEvent(QMouseEvent *event)
{
    qDebug()<<"鼠标点击坐标"<<event->x()<<","<<event->y()<<endl;
    if(event->button()==Qt::LeftButton){
        qDebug()<<"点击了左键"<<endl;
    }else if(event->button()==Qt::RightButton){
        qDebug()<<"点击了右键"<<endl;
    }

}

void Widget::mouseMoveEvent(QMouseEvent *event){
    qDebug()<<"鼠标点击不动的坐标"<<event->x()<<","<<event->y()<<endl;
}

void Widget::mouseDoubleClickEvent(QMouseEvent *event){
    qDebug()<<"鼠标双击的坐标"<<event->x()<<","<<event->y()<<endl;
}

void Widget::mouseReleaseEvent(QMouseEvent *event){
    qDebug()<<"鼠标释放了"<<endl;
}

void Widget::wheelEvent(QWheelEvent *event){
    if(event->orientation()==Qt::Vertical)//如果滚动方向是垂直方向
    {
        qDebug()<<"滚轮"<<event->x()<<","<<event->y()<<endl;

    }
}

void Widget::keyPressEvent(QKeyEvent *event){
    qDebug()<<event->key()<<endl;
    //打印出按下的键的ASCII码  a--65
    if(event->modifiers()==Qt::ShiftModifier){
        qDebug()<<"按下了shift按键"<<endl;
    }
    else if(event->modifiers()==Qt::ControlModifier){
        qDebug()<<"按下了Ctrl按键"<<endl;
    }
}

void Widget::keyReleaseEvent(QKeyEvent *event){
    qDebug()<<"释放了"<<event->key()<<"按键"<<endl;
}

void Widget::resizeEvent(QResizeEvent *event){
    qDebug()<<"窗口大小发生了改变"<<endl;
    qDebug()<<"改变前的大小"<<event->oldSize()<<endl;
    qDebug()<<"改变后的大小"<<event->size()<<endl;
}

void Widget::enterEvent(QEvent *event){
    qDebug()<<"进入"<<endl;
}

void Widget::leaveEvent(QEvent *event){
    qDebug()<<"离开"<<endl;
}
           

具体效果大家可以操作学习查看。

继续阅读