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);
}