当前位置:网站首页>QT专题:事件机制event基础篇
QT专题:事件机制event基础篇
2022-08-02 09:29:00 【迷途君】
1.事件的简述
事件机制主要可以分为两类
1.在与用户交互时发生,比如按下鼠标(mousepressEvent),敲键盘(可以pressEvent)等。
2.系统自动发生,比如计时器事件(timerEvent)。
当发生事件,比如点击鼠标或键盘,就会产生一个QEvent对象,这里注意QT中所有的事件类都继承于QEvent,这个QEvent对象会传给当前组件的event函数,如果没有事件过滤器,则该函数会按照事件对象的类型发送到特定的xxxEvent事件处理函数中进行处理。
2.几种常见的事件机制
1.鼠标移动:mouseMoveEvent()
2.鼠标单击:mousePressEvent()
3.鼠标双击:mouseDoubleClickEvent()
4.鼠标弹起:mouseReleaseEvent()
5.鼠标滚轮:wheelEvent()
6.键盘按下:keyPressEvent()
7.键盘弹起:keyReleaseEvent()
这些函数都是虚函数,这意味着我们可以在子类中进行重写,来达到我们想要的功能!!!
3.事件重写
那么我们看一段代码来理解一下吧,在下面这段代码中我们重写了上述几种常见的事件来达到演示的效果:
1.鼠标移动事件
//鼠标移动事件
void Widget::mouseMoveEvent(QMouseEvent *event)
{
qDebug() << "鼠标移动事件" << event->pos();
pos = event->pos(); //鼠标点击坐标
update(); //强制激发一次绘图事件
}
当我们移动鼠标可以看到我们打印的鼠标所在位置发生改变:
2.鼠标单击以及鼠标按键释放
void Widget::mousePressEvent(QMouseEvent *event)
{
qDebug() << "鼠标单击" << event->button();
mouseReleased = false;
pos = event->pos(); //鼠标点击坐标
update(); //强制激发一次绘图事件
}
//重写鼠标弹起事件的处理动作
void Widget::mouseReleaseEvent(QMouseEvent *event)
{
mouseReleased = true;
update();
qDebug() << "鼠标弹按键释放" << event->button();
}
当我们点击鼠标释放后可以看到下面情况:
可以看出1和2分别就代表了我们的鼠标左键和右键 !!
3.鼠标双击和滚轮事件
//重写鼠标双击事件的处理动作
void Widget::mouseDoubleClickEvent(QMouseEvent *event)
{
qDebug() << "鼠标双击" << event->button();
}
//滚轮事件
void Widget::wheelEvent(QWheelEvent *event)
{
qDebug() << "滚轮事件" << event->delta();
}
当我们双击鼠标滑动滚轮可以看到下面的结果;
4.键盘按下和弹起
//键盘按下事件
void Widget::keyPressEvent(QKeyEvent *event)
{
qDebug() << "键盘按下事件" << event->key();
}
//键盘弹起事件
void Widget::keyReleaseEvent(QKeyEvent *event)
{
qDebug() << "键盘释放事件" << event->key();
}
我分别按下了qwe键,看看结果:
分别显示了他们对应的ASCII值,到此我们了解了我们是可以对事件进行重写的,基于这个那我们就可以完成一些更高级的操作了!!
5.绘图事件PaintEvent
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
//startTimer(50); //启动内置定时器,以产生周期性的定时器事件(激活timerEvent())
//setMouseTracking(true); //不用按住鼠标左键,也可以捕获鼠标移动事件
pix = new QPixmap(640, 480); //图片缓冲
pix->fill();
mouseReleased = true;
}
QPainter p(this);
p.drawPoint() 点
p.drawLine() 直线
p.drawRect() 矩形
p.drawEllipase() 椭圆
p.drawText()画文字
p.drawPixmap()画图
看第一段演示代码:
1.画点线矩形圆图片文字
void Widget::paintEvent(QPaintEvent *event)
{
qDebug() << "paint event !!!!!";
//画用户自己的想法
QPainter p(this);
QPen pen; //画笔,画线用
pen.setWidth(10);
p.setPen(pen);//设置画笔的粗细
QBrush brush;//画刷,画填充
brush.setColor(Qt::red);//设置颜色
brush.setStyle(Qt::DiagCrossPattern);//设置网格笔刷
p.setBrush(brush);
p.drawPoint(pos); //画点
p.drawLine(QPoint(0, 0), pos); //画线,起始坐标到鼠标点的坐标
p.drawRect(0, 0, pos.x(), pos.y()); //画矩形
p.drawEllipse(pos, 200, 100); //画椭圆
p.drawText(pos.x(), pos.y(), "你好"); //画文字
//画图片
p.drawPixmap(pos.x(), pos.y(), 100, 100, QPixmap("图片路径"));
}
看看运行结果:
2.画家和界面有各自的坐标系,我们可以移动画家的位置可以缩放
p.translate();移动
p.scale() 缩放
p.rotate()旋转:
void Widget::paintEvent(QPaintEvent *event)
{
qDebug() << "paint event !!!!!";
QPainter p(this);
p.translate(width()/2, height()/2); //移动画家
p.rotate(30); //转动画家坐标系
p.drawLine(QPoint(0, 0), QPoint(100, 0));
p.scale(0.5, 0.5); //画家缩放
p.drawEllipse(QPoint(0, 0), 100, 100);
p.drawEllipse(QPoint(width()/2, height()/2), 100, 100);
}
看看结果:很明显我们移动了画家的位置以及旋转了坐标系
3.但每次我们要画下一个图,前面我们画的图形就会消失,于是有了双缓冲画法,可以将历史记录进行保存,在下次画的时候也能保留原来的图形:
/*双缓冲绘制*/
void Widget::paintEvent(QPaintEvent *event)
{
qDebug() << "paint event !!!!!";
QPainter p(this);
//1. 画上一次的历史记录
p.drawPixmap(0, 0, *pix);
//2. 画用户自己的新内容
p.drawLine(QPoint(0, 0), pos); //画线
if(mouseReleased) //鼠标弹起了
{
//3. 画到历史记录里
QPainter p1(pix);
p1.drawLine(QPoint(0, 0), pos);
}
}
边栏推荐
- 裁员趋势下的大厂面试:“字节跳动”
- Jenkins--部署--3.1--代码提交自动触发jenkins--方式1
- The use of thread pool and analysis of ThreadPoolExecutor source code
- LeetCode_2357_使数组种所有元素都等于零
- The love-hate relationship between C language volatile keyword, inline assembly volatile and compiler
- The k-nearest neighbor method in the notes of Li Hang's "Statistical Learning Methods"
- 图形化矩阵,矩阵到底长什么样?
- Re22:读论文 HetSANN An Attention-based Graph Neural Network for Heterogeneous Structural Learning
- LeetCode第三题(Longest Substring Without Repeating Characters)三部曲之一:解题思路
- 破解wifi密码 暴力破解 保姆式教学
猜你喜欢
In the whole development of chi V853 board tried to compile QT test
net start mysql MySQL 服务正在启动 . MySQL 服务无法启动。 服务没有报告任何错误。
从零开始入门单片机(一):必会背景知识总结
[Must read] Mylander valuation analysis, electrical stimulation products for pelvic and postpartum rehabilitation
Daily practice of dynamic programming (3)
Rust 从入门到精通03-helloworld
AlterNET Studio用户界面设计功能扩展
谈谈对Volatile的理解
Naive Bayesian Method of Li Hang's "Statistical Learning Methods" Notes
李航《统计学习方法》笔记之监督学习Supervised learning
随机推荐
单机部署flink,创建oracle19c rac的连接表时报错 ORA-12505 ,怎么回事?
边缘计算开源项目概述
要长续航还是更安全?海豹与深蓝SL03对比导购
system_error错误处理库学习
新起点丨MeterSphere开源持续测试平台v2.0发布
Pytorch的LSTM参数解释
破解wifi密码 暴力破解 保姆式教学
Worship, Alibaba distributed system development and core principle analysis manual
spark:商品热门品类TOP10统计(案例)
SAP 云平台上一种 Low Code Development(低代码开发)解决方案
小程序云开发(十):渐变与动画
Facebook自动化数据分析方案,广告投放省心省力
node制作一个视频帧长图生成器
李航《统计学习方法》笔记之监督学习Supervised learning
PyQt5安装配置(PyCharm) 亲测可用
Two-dimensional array piecemeal knowledge sorting
【微信小程序2】事件绑定
Golang ORM框架 — GORM
堪称神级的阿里巴巴“高并发”教程《基础+实战+源码+面试+架构》
【Redis】通用命令