天天看點

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;
}
           

具體效果大家可以操作學習檢視。

繼續閱讀