QT中事件与图形处理详细(鼠标、键盘、定时等事件与图片加载处理)

QT事件

简介:QT程序是事件驱动的,程序的每个动作都是由内部某个事件所触发。QT事件的发生和处理成为程序运行的主线,存在于程序整个生命周期。
常见的QT事件类型如下:

 键盘事件: 按键按下和松开
 鼠标事件: 鼠标移动,鼠标按键的按下和松开
 拖放事件: 用鼠标进行拖放
 滚轮事件: 鼠标滚轮滚动
 绘屏事件: 重绘屏幕的某些部分
 定时事件: 定时器到时
 焦点事件: 键盘焦点移动
 进入和离开事件: 鼠标移入widget之内,或是移出
 移动事件: widget的位置改变
 大小改变事件: widget的大小改变
 显示和隐藏事件: widget显示和隐藏
 窗口事件: 窗口是否为当前窗口

事件处理过程如下:
无过滤器
用户操作-》系统消息发送-》Qt平台接收后封装为QEvent对象-》分发事件-》不同事件处理
事件继承如下

			QEvent
				QTimerEvent
				QPaintEvent
				QInputEvent
					QKeyEvent
					QMouseEvent
				QCloseEvent
				QDropEvent

QWidget中的事件处理函数有很多,他们是protected virtual的,可以在他们的子类中重新实现
鼠标事件

					void mousePressEvent(QMouseEvent *event) override:鼠标按下事件  重写(override)
						event->button记录了鼠标按下的键,值为Qt::LeftButton或Qt::RightButton表示鼠标的左右键
					void mouseReleaseEvent(QMouseEvent *event):鼠标弹起事件
					void mouseMoveEvent(QMouseEvent *event):鼠标移动事件
						event->x()和event->y()记录了鼠标的坐标
					void mouseDoubleClickEvent(QMouseEvent *event):鼠标双击事件
					void wheelEvent(QWheelEvent *event):鼠标滚轮滚动事件
						event->delta()>0:上滚,反之下滚

键盘事件

					void keyPressEvent(QKeyEvent *event):键盘按下事件
						event->key()记录按下的按键,值为Qt::Key_Escape和Qt::Key_F1.....对于键盘的按键
					void keyReleaseEvent(QKeyEvent *event):按键弹起事件

定时器事件

					void timerEvent(QTimerEvent *event):定时器事件
						1.调用startTimer(毫秒)函数启动定时器,返回一个整型的id
						2.当定时时间到来会执行timerEvent事件处理函数,所以重写该函数即可
						3.在timerE1vent函数中event->timerId()可以获取到触发函数的定时器id
							killTimer(定时器id):终止指定的定时器
			
			重写鼠标点击事件:
				在头文件的protect中声明void mousePressEvent(QMouseEvent *event);
				
				在.cpp文件中编写void mousePressEvent(QMouseEvent *event)函数的实现
					可以通过event->button与Qt::LeftButton比较知道点击了哪个键
	
	#include <QPlainTextEdit>//获取鼠标选中内容
		QPlainTextEdit PTextEdit;//定义一个对象

事件过滤器
用户操作-》系统消息发送-》Qt平台接收后封装为QEvent对象-》事件过滤-》事件处理
通过控件对象->installEventFilter(this)的方式注册过滤器

重写函数

			在头文件的protected中声明bool eventFilter(QObject *target, QEvent *e);
			
			在.cpp文件中编写bool eventFilter(QObject *target, QEvent *e);函数的实现
				target是触发事件的对象,e->type() == QEvent::MouseButtonPress判定触发的事件
				QEvent::Close		窗体已关闭 (QCloseEvent).
				QEvent::KeyPress	按键按下 (QKeyEvent).
				QEvent::KeyRelease	按键弹起 (QKeyEvent).
				QEvent::MouseButtonDblClick		鼠标再次按下 (QMouseEvent).
				QEvent::MouseButtonPress		鼠标按下 (QMouseEvent).
				QEvent::MouseButtonRelease		鼠标弹起 (QMouseEvent).
				QEvent::MouseMove				鼠标移动 (QMouseEvent).
				QEvent::Paint		重绘事件(QPaintEvent).
				QEvent::Timer		计时器事件 (QTimerEvent).
				QEvent::Wheel		鼠标滚轮滚动 (QWheelEvent).

QT 绘图

	Qt提供4个类来处理图像:QImage、QPixmap、QBitmap、QPicture,为了对这几个类加以区分
		分别称QImage为图像、QPixmap为像素图、QBitmap为位图、QPicture为图片,作用如下:
		1.QImage类提供了一个与硬件无关的图像表示方法,是为了修改图片上的像素或者修改图片效果而设计的,
		提供了高效率的IO,一般图片大的情况下,用QImage进行加载
		
		2.QPixmap类提供了一个与硬件有关的图像表示方法,是专门为了绘图而产生的,QPixmap绘制效果是最好的
			也可以用于在Label控件之类的上面做图像展示

		3.QBitmap是QPixmap的子类,用于处理颜色深度为1的图像,即只能显示黑白两种颜色
		
		4.QPicture用来记录并重演QPainter命令,QPicture与分辨率无关,可在不同设备上显示。
		该类使用一个与平台无关的格式(.pic格式)把绘图命令序列化到I/O设备。
		
		通常,可以使用QImage类来加载并操作图像数据,然后把QImage对象转换为QPixmap再显示到屏幕上,若不需对图像进行操作,
		也可直接使用QPixmap来加载并显示图像
		
		QImage img;
		img.load("图片地址"):加载图片
		img.height():获取图片的高度
		img.weight():获取图片的宽度
		img.save("路径"):将Qimage保存到指定路径
		QPixmap pix = QPixmap::fromImage(img):将Qimage转为QPixmap对象
		
		QPixmap pix;
		pix.load("图片地址"):加载图片
		pix.height():获取图片的高度
		pix.weight():获取图片的宽度
		pix.save("路径"):将QPixmap保存到指定路径
		QImage img = pixmap.toImage():将pixmap转为QImage对象
		label控件->setPixmap(pix):设置label显示的图像
		label控件->setScaledContents(true):图像自适应label的大小
		
		
	
		使用QPainter类中绘制图像的函数:
			QPainter pr;
			pr.begin(this);  //添加画布,可以在窗口中画或是QPixmap、QImage等
			添加画笔:
				QPen pen;
				pen.setWidth(宽度):画笔宽度
				pen.setColor(QColor(r,g,b)):设置线条颜色
				pr.setPen(pen):绘图工具设置画笔
				需要在begin函数之后设置画笔才能成功
			pr.drawPoint(x轴起点,y轴起点):在画布中绘制点
			pr.drawLine(x轴起点,y轴起点,x轴终点,y轴终点):在画布中绘制线
			pr.drawRect(x轴起点,y轴起点,宽度,高度):在画布中绘制矩形
			pr.drawEllipse(x轴起点,y轴起点, 宽度, 高度):在画布中绘制圆形
			pr.drawArc(参数1,参数2,参数3):在画布中绘制弧线
				参数1:QRect(x轴起点,y轴起点,宽度,高度),指明一个矩形的内接椭圆区域
				参数2:指定起始角度,指定的角度乘以16
				参数3:指定终点角度,指定的角度乘以16
			pr.drawPie(参数1,参数2,参数3):在画布中绘制扇形,与弧线同理
			pr.drawChord(参数1,参数2,参数3):在画布中绘制弦,与弧线同理
			添加字体:
				QFont font;
				font.setBold(bool):是否加粗
				font.setFamily("字体"):设置字体
				font.setItalic(bool):是否斜体
				font.setPointSize(字体大小):设置字体大小
				font.setUnderline(bool):是否添加下划线
				font.setStrikeOut(bool):是否添加删除线
				pr.setFont(font): 绘图工具设置字体
			pr.drawText(x轴起点,y轴起点,"文本"):在画布中绘制文字
			pr.drawText(rect(), Qt::AlignCenter,"文本"):在画布区域中居中
			pr.drawPixmap(x轴起点,y轴起点,宽度,高度,QPixmap对象):在画布中绘制QPixmap图片
			pr.end():结束画布
			
		painEvent事件:
			void paintEvent(QPaintEvent *event):事件是在窗体重绘时触发的事件
			repaint():调用该函数可以触发一次窗体重绘事件
			
		
			
		设置不规则形状控件:
				QPixmap pixmap0("图片路径", "PNG");  //加载图片
				pixmap0 = pixmap0.scaled(ui->控件对象->size()); //设置图形大小为控件的大小
				ui->控件对象->setMask(pixmap0.mask()); //将控件的阴影区域设置为图片的阴影区域
				注意:可以取消控件的边框,自定义一个背景色

		窗口不规则:
				Widget::Widget(QWidget *parent)
					: QWidget(parent)
				{
					//隐藏窗体顶部的标题栏
					this->setWindowFlags(Qt::FramelessWindowHint|Qt::WindowMinimizeButtonHint);
					//透明当前窗体
					this->setAttribute(Qt::WA_TranslucentBackground);
					//加载图片
					pix.load("图片路径");
					//改变窗体大小为图片大小
					this->resize(pix.size());    
				}
				
				void Widget::paintEvent(QPaintEvent *e)
				{
					//加载this为画布
					QPainter painter(this);
					//将图片绘制到窗体
					painter.drawPixmap(0,0,pix);
				}
  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值