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打印"<<endl;
    QPoint p = event->globalPos();//获取全局

    qDebug()<<"QPoint globalPos"<<p.x()<<" "<<p.y()<<endl;
    qDebug()<<event->x()<<" "<<event->y()<<endl;
}

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打印"<<endl;

    if(event->key() == Qt::Key_Q){//这里校验是不是按下了Q
        //每秒使按钮上移一点
        ui->pushButton->move(ui->pushButton->x(),ui->pushButton->y()-20);
    }
}

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()<<"定时间事件"<<endl;
    //每秒使按钮右移一点
    ui->pushButton->move(ui->pushButton->x()+10,ui->pushButton->y());
}
//关闭定时事件
void Widget::keyPressEvent(QKeyEvent *event){

    if(event->key() == Qt::Key_S){//这里校验是不是按下了S
        qDebug()<<"定时事件停止"<<endl;
        killTimer(timerEvent1);
    }
}

5. 事件的过滤

event

widget.h

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

widget.cpp

//事件过滤
bool Widget::eventFilter(QObject *watched, QEvent *event){
    qDebug()<<"事件过滤22222"<<endl;

    if(event->type() == QEvent::MouseButtonPress){//如果鼠标按下,证明是我们需要的事件,我们可以进一步处理
        qDebug()<<"222222222"<<endl;
        return true;
    }

    //如果不是我需要的事件,就调用基类过滤,让基类处理
    return QWidget::eventFilter(watched,event);
}

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值