一、事件QEvent是个啥?
通过专栏的上篇《信号与槽》初步了解了信号槽的机制,本质上信号与槽属于事件,信号是信号事件,而槽对应的则是进行处理的回调函数。
事件由系统或者Qt本身发出。例如当用户按下鼠标、敲下键盘、定时器计时等情况,都会发出一个相应的事件。然后可直接在对应的事件处理函数中进行处理。
类比于信号与槽的机制就是事件本身是信号,事件处理函数类比于槽函数来理解。
常用的事件(向右滑动➡️) | 对应的事件处理函数 |
---|---|
键盘按下事件 | keyPressEvent() |
键盘释放事件 | keyReleaseEvent() |
鼠标按下事件 | mousePressEvent() |
鼠标释放事件 | mouseReleaseEvent() |
定时器事件 | timerEvent() |
绘图事件 | paintEvent() |
事件处理函数都是虚函数,已在基类中声明,可直接在具体的派生类中覆盖重写。
二、定时器事件 QTimerEvent
我们启动一个定时器计时,然后在对应的事件处理函数中进行处理:
/*注意头文件*/
#include < QTimer >
/*启动定时器*/
startTimer(1000);//参数间隔,单位ms
/*
可以通过startTimer的返回值timerId来开启多个定时器进行区分应用;
当定时器计数到时,如上到1000ms后就会类似产生一个中断,然后去执行我们在派生类中重新覆写的事件处理函数timerEvent
*/
/*事件处理函数*/
void MyWidget::timerEvent(QTimerEvent *ev)
{
/*定时器到时后自动触发执行此处代码*/
}
当需要启动多个定时器时,推荐多开方式:
/*new出来的定时器对象在堆区,人为可控*/
QTimer * timer1 = new QTimer(this);
QTimer * timer2 = new QTimer(this);
timer1->start(500);//500ms间隔启动定时器
connect(timer1,&QTimer::timeout,[=](){
//laber每隔0.5秒+1
ui->laber->setText(QString::number(num++));
} );
//点击一个按钮,实现停止定时器
connect(ui->btn,&QPushbutton::clicked,[=](){
timer1—>stop();//再启动就是start()
});
三、绘图事件
贪吃蛇项目中还有使用到的事件就是绘图事件:
/*相关的有画家QPainter、画笔QPen、笔刷QBrush(也对应头文件)*/
void paintEvent(QPaintEvent *)
{
/*触发条件:
1. 自动触发: 窗口初次显示、窗口部件调整大小、窗口遮挡;
2. 人为触发:调用QWidget::update();或QWidget::repaint();
通过触发条件,跳转到paintEvent绘图事件函数中进行处理
*/
}
Qt的绘图系统实际上是使用QPainter在QPainterDevice上进行绘制,而对于QPainterDevice来说,Qt提供了四个这样的类:
- QPixmap
- QBitmap
- QImage
- QPicture
分享微信公众号『设计至纯』,查看更多原创内容,O(∩_∩)O一键三连、分享、收藏、点赞、支持。 ^ o ^ 您的点赞、评论和关注,是小小编继续创作的不懈动力。 😀
转载:https://blog.csdn.net/caq_jw/article/details/114854453
查看评论