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);
}
}
![](https://img-blog.csdnimg.cn/direct/e3b1d2072a4346f9bd4c6211b7bc4cda.png)
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);
}