Qt事件的使用

1. 事件

事件:对应用程序施加的一些操作(外部/内核),让应用程序对相关的操作进行处理的方式

QT中事件的产生(键盘事件、鼠标事件、定时器事件、绘画事件等等)、事件的经过(事件的传递或者是派送)、事件结果

1.1 大致的流程:

操作系统接收产生的事件(鼠标、键盘等等)-----QAppliction(应用程序)监听事件-----将事件分发给QEvent------下发给具体的事件处理对象(按钮对象、标签对象等等)-----具体的事件处理对事件(键盘事件、鼠标事件)进行处理

1.2 事件的处理

事件机制exec:

1、Qt的应用管理对象通过执行exec()事件循环,进行捕获等待事件产生

2、应用管理对象根据事件内容,分发事件出去,具体的应用中的窗口部件

3、进行事件过滤

4、事件处理

(Qt已经设计好的Qt窗口部件,对事件的处理已经设计完成)

整个Qt程序,以事件驱动程序运行,通过信号槽执行

事件处理:

在Qt中,事件的类型已经完整的定义出来,但是对事件的操作事件的处理各不相同,需要对我们自己设计的窗口部件进行事件处理

当产生事件时,对象会调用对应的事件处理函数来执行

1.3 常用的事件:

键盘事件

鼠标事件

定时器事件

绘画事件等等

函数原型

virtual void actionEvent(QActionEvent *event)
 virtual void changeEvent(QEvent *event)
 virtual void closeEvent(QCloseEvent *event)  //当窗口关闭时触发该事件
 virtual void contextMenuEvent(QContextMenuEvent *event)
 void create(WId window = 0, bool initializeWindow = true, bool destroyOldWindow = true)
 void destroy(bool destroyWindow = true, bool destroySubWindows = true)
 virtual void dragEnterEvent(QDragEnterEvent *event)
 virtual void dragLeaveEvent(QDragLeaveEvent *event)
 virtual void dragMoveEvent(QDragMoveEvent *event)
 virtual void dropEvent(QDropEvent *event)
 virtual void enterEvent(QEvent *event)  //当鼠标进入到窗口时触发该事件
 virtual void focusInEvent(QFocusEvent *event)
 bool focusNextChild()
 virtual bool focusNextPrevChild(bool next)
 virtual void focusOutEvent(QFocusEvent *event)
 bool focusPreviousChild()
 virtual void hideEvent(QHideEvent *event) //窗口隐藏,产生该事件
 virtual void inputMethodEvent(QInputMethodEvent *event)
 virtual void keyPressEvent(QKeyEvent *event)
 virtual void keyReleaseEvent(QKeyEvent *event)
 virtual void leaveEvent(QEvent *event)  //鼠标离开界面时触发该事件
 virtual void mouseDoubleClickEvent(QMouseEvent *event)  //鼠标双击时,产生该事件
 virtual void mouseMoveEvent(QMouseEvent *event)  //鼠标移动时,产生该事件
 virtual void mousePressEvent(QMouseEvent *event)  //鼠标按下时,产生事件
 virtual void mouseReleaseEvent(QMouseEvent *event)  //鼠标释放时,产生该事件
 virtual void moveEvent(QMoveEvent *event)  
 virtual bool nativeEvent(const QByteArray &eventType, void *message, long *result)  
 virtual void paintEvent(QPaintEvent *event)//绘画事件
 virtual void resizeEvent(QResizeEvent *event)  //窗口大小变化时触发该事件
 virtual void showEvent(QShowEvent *event)   //当窗口显示时,产生该事件
 virtual void tabletEvent(QTabletEvent *event)
 virtual void wheelEvent(QWheelEvent *event)  //滑轮变化时触发该事件

2. 鼠标事件处理 QMouseEvent

2.1 知识点

QMouseEvent:鼠标事件类

鼠标事件函数原型


virtual void mouseDoubleClickEvent(QMouseEvent *event)
virtual void mouseMoveEvent(QMouseEvent *event)
virtual void mousePressEvent(QMouseEvent *event)
virtual void mouseReleaseEvent(QMouseEvent *event)

2.2 举例

event

widget.h

//鼠标按下事件处理
    void mousePressEvent(QMouseEvent *event);

widget.cpp

//鼠标事件处理
void Widget::mousePressEvent(QMouseEvent *event){
    qDebug()<<"mousePressEvent打印"<globalPos();//获取全局

    qDebug()<<"QPoint globalPos"<x()<<" "<y()<

Qt事件的使用_第1张图片

3. 键盘事件处理 QKeyEvent

键盘事件处理函数:当产生对应的键盘事件就会调用

3.1 知识点

QKeyEvent:键盘事件类

函数原型


virtual void keyPressEvent(QKeyEvent *event)
virtual void keyReleaseEvent(QKeyEvent *event)

3.2 举例

event

widget.h

//键盘按下事件处理
    virtual void keyPressEvent(QKeyEvent* event);

widget.cpp

//键盘事件处理:参数就是当前的键盘事件
void Widget::keyPressEvent(QKeyEvent *event){
    qDebug()<<"keyPressEvent打印"<key() == Qt::Key_Q){//这里校验是不是按下了Q
        //每秒使按钮上移一点
        ui->pushButton->move(ui->pushButton->x(),ui->pushButton->y()-20);
    }
}

Qt事件的使用_第2张图片

4. 定时器事件处理 QTimerEvent

当定时事件到达溢出,就会产生一次定时事件

4.1 知识点

QTimerEvent:定时事件类

启动定时:开启定时事件

int QObject::startTimer(std::chrono::milliseconds time, Qt::TimerType timerType = Qt::CoarseTimer)

关闭定时:关闭定时事件

void QObject::killTimer(int id)

定时事件处理:

void timerEvent(QTimerEvent *event)

4.2 举例

event

widget.h

//定时事件处理
    void timerEvent(QTimerEvent* event);

widget.cpp

//启动定时使事件的按钮
void Widget::on_pushButton_clicked()
{
    timerEvent1 = this->startTimer(1000);//启动定时,单位是毫秒,这里我们是1秒

}
//定时时间处理实现
void Widget::timerEvent(QTimerEvent *event){

    qDebug()<<"定时间事件"<pushButton->move(ui->pushButton->x()+10,ui->pushButton->y());
}
//关闭定时事件
void Widget::keyPressEvent(QKeyEvent *event){

    if(event->key() == Qt::Key_S){//这里校验是不是按下了S
        qDebug()<<"定时事件停止"<
Qt事件的使用_第3张图片

5. 事件的过滤

event

widget.h

//事件过滤函数
    bool eventFilter(QObject *watched, QEvent *event);

widget.cpp

Qt事件的使用_第4张图片

//事件过滤
bool Widget::eventFilter(QObject *watched, QEvent *event){
    qDebug()<<"事件过滤22222"<type() == QEvent::MouseButtonPress){//如果鼠标按下,证明是我们需要的事件,我们可以进一步处理
        qDebug()<<"222222222"<

Qt事件的使用_第5张图片

你可能感兴趣的:(Qt,qt,c++,c语言)