QT 绘制事件 PaintEvent

本文介绍Qt框架中事件处理机制的基本原理,包括信号与槽的概念及其应用,并通过一个具体的paintEvent实例展示了如何覆盖默认事件处理函数以实现自定义行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对事件的响应是通过信号与槽调用
事件中根据事件触发的条件发出不同的信号
比如:鼠标事件发出clicked与dblclicked等信号


QT中事件是怎么实现的?
QT把事件自己定义成固定的virtual保护函数
这些函数自动被系统调用


1. paintEvent
案例:
覆盖QWidget的paintEvent


DemoPushButton.h文件:

#ifndef DEMOPUSHBUTTON_H
#define DEMOPUSHBUTTON_H

#include <QPushButton>
#include <QPaintEvent>
#include <QMouseEvent>

class DemoPushButton : public QPushButton
{
public:
DemoPushButton(QWidget * parent=NULL);

protected:
virtual void paintEvent(QPaintEvent * e);
virtual void enterEvent(QEvent * e);
virtual void leaveEvent(QEvent * e);
virtual void mousePressEvent(QMouseEvent*e);

private:
bool israised;

};

#endif // DEMOPUSHBUTTON_H


DemoPushButton.cpp文件:

#include "DemoPushButton.h"

#include <QColor>
#include <QBrush>
#include <QPen>
#include <QPoint>
#include <QPainter>


DemoPushButton::DemoPushButton(QWidget*parent)
:QPushButton(parent),israised(true)
{
setMouseTracking(true); //跟踪鼠标移动事件
}

void DemoPushButton::paintEvent(QPaintEvent* e)
{
QPushButton::paintEvent(e);// return;
//绘制按钮的边界
int w=width(); //按钮宽度
int h=height(); //按钮高度
QColor clrw(255,255,255);
QColor clrb(0,0,0);
QBrush brw(clrw);
QBrush brb(clrb);
QPen penw(brw,2);
QPen penb(brb,2);
QPoint pttop(w/2,0);
QPoint ptbottom(w/2,h);
QPoint ptleft(0,h/2);
QPoint ptright(w,h/2);
QPainter g(this);
if(israised)
{
g.setPen(penw);
}
else
{
g.setPen(penb);
}

g.drawLine(pttop,ptleft);
g.drawLine(pttop,ptright);

if(israised)
{
g.setPen(penb);
}
else
{
g.setPen(penw);
}

g.drawLine(ptbottom,ptleft);
g.drawLine(ptbottom,ptright);

QPen penc;
penc.setStyle(Qt::DashDotLine);
penc.setWidth(3);
penc.setBrush(Qt::gray);
penc.setCapStyle(Qt::RoundCap);
penc.setJoinStyle(Qt::RoundJoin);
g.setPen(penc);
g.drawRect(0, 0, width(), height()/2 );

//QPushButton::paintEvent(e);
}


void DemoPushButton::enterEvent(QEvent * e)
{
israised=false;
repaint(); //重新绘制按钮
}


void DemoPushButton::leaveEvent(QEvent * e)
{
israised=true;
repaint();
}


void DemoPushButton::mousePressEvent(QMouseEvent * e)
{
//repaint();

QPushButton::mousePressEvent(e);
}


QPainter类:
函数分成:
属性函数
背景
刷子
遮罩

字体
绘制函数
图形
空心draw****
实心fill****
图像
字符串
变换函数
translate
scale
rotate 旋转
shear
### QT 中 `paintEvent` 的使用方法 在 Qt 应用程序中,`paintEvent` 是用于自定义绘图的关键函数之一。每当窗口需要重绘时,此事件会被触发。 #### 基本结构 当继承 QWidget 或其子类创建自定义控件时,可以通过覆写 `paintEvent` 方法来进行图形绘制工作。下面是一个简单的例子展示如何实现基本的绘画逻辑: ```cpp void MyWidget::paintEvent(QPaintEvent *event) { QPainter painter(this); // 设置画笔颜色为黑色 painter.setPen(Qt::black); // 绘制矩形 painter.drawRect(10, 15, 90, 60)[^1]; } ``` 这段代码展示了最基础的形式,在其中实例化了一个 `QPainter` 对象并指定了要绘制的目标 widget (`this`)。接着设置了画笔的颜色,并调用了 `drawRect()` 函数来绘制一个矩形。 #### 动态更新与性能考虑 对于动态内容或动画效果来说,通常不推荐频繁地直接调用 `paintEvent()` ,因为这可能导致无限循环或其他不可预测的行为。相反,应该利用 `update()` 或者 `repaint()` 来请求刷新显示区域[^3]。 例如,为了实现平滑过渡的效果,可以结合定时器机制定期触发重绘操作: ```cpp class AnimationWidget : public QWidget { protected: void timerEvent(QTimerEvent *) override; }; AnimationWidget::AnimationWidget(QWidget *parent):QWidget(parent){ startTimer(100); // 启动每秒十次的时间间隔计时器 } void AnimationWidget::timerEvent(QTimerEvent *) { update(); // 请求重新绘制整个组件 } ``` 上述片段来自官方示例中的文字摆动案例[^2],这里通过覆盖 `timerEvent` 实现了周期性的自动重绘功能。 #### 图像资源处理 除了简单形状外,还可以轻松集成外部图像到应用程序里。以下是加载本地图片文件并在 `paintEvent` 内部渲染的方法概述: ```cpp QString filter = "Image Files (*.png *.jpg *.jpeg)"; QString imagePath = QFileDialog::getOpenFileName(nullptr,"选择一张图片","/",filter); if(!imagePath.isEmpty()){ QImageReader reader(imagePath); if(reader.canRead()){ QImage img = reader.read(); // 更新成员变量保存最新读取成功的图像路径 this->currentImagePath = imagePath; // 发送信号通知界面发生改变以便及时反映新状态 emit imageLoaded(img); } } // 在 paintEvent 中呈现选定的图像 void ImageDisplayWidget::paintEvent(QPaintEvent*) { QPainter p(this); QRect targetRect = rect().adjusted(10,10,-10,-10); p.drawImage(targetRect,QImage(currentImagePath)); } ``` 以上过程涵盖了从选取、验证直至最终展现给用户的完整流程[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值