当前位置:网站首页>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);
}
}
边栏推荐
猜你喜欢

【技术分享】OSPFv3基本原理

LeetCode第三题(Longest Substring Without Repeating Characters)三部曲之一:解题思路

高效时代,电商运营如何靠RPA快速提效?

2022牛客暑期多校训练营4(ADHKLMN)

【Flink 问题】Flink 如何提交轻量jar包 依赖该如何存放 会遇到哪些问题

线程池的使用及ThreadPoolExecutor源码分析

node封装一个图片拼接插件

Nodejs3day(express简介,express创建基本Web服务器,托管静态资源,nodemon下载及出现的问题,中间件,编写GET,POST,JSONP接口)

1对1视频源码——快速实现短视频功能提升竞争力

二维数组零碎知识梳理
随机推荐
新起点丨MeterSphere开源持续测试平台v2.0发布
sql concat(),如何才能拼接表的名字
SAP 云平台上一种 Low Code Development(低代码开发)解决方案
LeetCode_2357_使数组种所有元素都等于零
【SeaTunnel】从一个数据集成组件演化成企业级的服务
net start mysql MySQL 服务正在启动 . MySQL 服务无法启动。 服务没有报告任何错误。
day1-机器学习-回归问题
Have you ever learned about these architecture designs and architecture knowledge systems?(Architecture book recommendation)
SVN下载上传文件
[Concurrent programming] - Thread pool uses DiscardOldestPolicy strategy, DiscardPolicy strategy
It's time for bank data people who are driven crazy by reporting requirements to give up using Excel for reporting
In the whole development of chi V853 board tried to compile QT test
Use the scrapy to climb to save data to mysql to prevent repetition
Pytorch的LSTM参数解释
Talk about the understanding of Volatile
Bigder:41/100生产bug有哪些分类
Re23:读论文 How Does NLP Benefit Legal System: A Summary of Legal Artificial Intelligence
Daily practice of dynamic programming (2)
RetinaFace: Single-stage Dense Face Localisation in the Wild
AutoJs学习-实现谢尔宾斯基三角