QT学习笔记3

news/2025/3/22 3:17:00/
一、2D绘图系统(QPainter)
1. 核心机制

QPainter工作流程

cpp

void Widget::paintEvent(QPaintEvent*) {QPainter painter(this); // 绑定到当前控件painter.setRenderHint(QPainter::Antialiasing); // 抗锯齿painter.drawLine(0,0,100,100); // 绘制操作
}
  • 绘图设备:QPixmap(图像缓冲)、QImage(像素级操作)、QWidget(控件绘图)
2. 高级绘图技术

路径操作

(QPainterPath):

cpp

QPainterPath path;
path.moveTo(20, 20);
path.lineTo(100, 20);
path.quadTo(150, 50, 100, 100); // 贝塞尔曲线
painter.drawPath(path);

复合变换

(缩放+旋转):

cpp

painter.save(); // 保存当前状态
painter.translate(50,50); // 移动坐标系
painter.rotate(45); // 旋转
painter.scale(2, 2); // 放大
painter.drawRect(0,0,10,10); // 应用所有变换后绘制
painter.restore(); // 恢复原始坐标系
3. 图像处理技巧

双缓冲技术

cpp

QPixmap buffer(size()); 
buffer.fill(Qt::transparent);
QPainter bufferPainter(&buffer);
// 在buffer上绘制复杂图形
painter.drawPixmap(0, 0, buffer); // 一次性绘制到屏幕

图像合成模式

cpp

painter.setCompositionMode(QPainter::CompositionMode_Overlay); // 叠加模式
4. 性能优化
  • 预渲染缓存:将静态内容绘制到QPixmap,避免重复计算
  • 局部更新:使用update(QRect)指定脏矩形区域

二、图形视图框架(Graphics View)
1. 体系结构详解

场景(QGraphicsScene)

cpp

scene = new QGraphicsScene(this);
scene->setSceneRect(0,0,800,600); // 设置场景范围

视图(QGraphicsView)

cpp

QGraphicsView *view = new QGraphicsView(scene);
view->setRenderHint(QPainter::Antialiasing);
view->setDragMode(QGraphicsView::RubberBandDrag); // 框选模式

图形项(QGraphicsItem)

cpp

class CustomItem : public QGraphicsItem {QRectF boundingRect() const override { ... }void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override { ... }
};
2. 高级功能实现

碰撞检测

cpp

QList<QGraphicsItem*> collisions = item->collidingItems(Qt::IntersectsItemBoundingRect);

图形特效

cpp

QGraphicsBlurEffect *effect = new QGraphicsBlurEffect;
effect->setBlurRadius(5);
item->setGraphicsEffect(effect);
3. 动画与状态机

属性动画

cpp

QPropertyAnimation *anim = new QPropertyAnimation(item, "rotation");
anim->setDuration(1000);
anim->setStartValue(0);
anim->setEndValue(360);
anim->setEasingCurve(QEasingCurve::OutBounce);
anim->start();

状态机设计

cpp

QStateMachine machine;
QState *state1 = new QState();
QState *state2 = new QState();
state1->assignProperty(button, "color", Qt::red);
state2->assignProperty(button, "color", Qt::green);
machine.addTransition(button, &QPushButton::clicked, state1, state2);

三、3D绘图(OpenGL集成)
1. OpenGL上下文管理

基础Widget

cpp

class GLWidget : public QOpenGLWidget, protected QOpenGLFunctions {void initializeGL() override { initializeOpenGLFunctions(); }void paintGL() override { glDrawArrays(...); }
};
2. 核心渲染技术

顶点缓冲对象(VBO)

cpp

GLfloat vertices[] = { ... };
QOpenGLBuffer vbo(QOpenGLBuffer::VertexBuffer);
vbo.create();
vbo.bind();
vbo.allocate(vertices, sizeof(vertices));

着色器编程

cpp

QOpenGLShaderProgram program;
program.addShaderFromSourceCode(QOpenGLShader::Vertex, vertShaderSrc);
program.link();
program.bind();
3. 高级渲染技术

Phong光照模型

glsl

// Fragment Shader
vec3 lightDir = normalize(lightPos - FragPos);
float diff = max(dot(normal, lightDir), 0.0);
vec3 diffuse = diff * lightColor;

纹理映射

cpp

QOpenGLTexture *texture = new QOpenGLTexture(QImage(":/texture.png"));
texture->bind();

四、实战建议
  1. 调试工具:使用qDebug() << scene->items().count()监控场景项数量
  2. 性能监控:重写QGraphicsItem::paint()时记录绘制时间
  3. 跨平台注意:OpenGL ES与桌面OpenGL的差异处理
  4. 资源管理:使用QOpenGLTexture::setAutoMipMapGeneration(true)自动生成Mipmap

五、学习资源
  • 官方文档:Qt Graphics View Framework
  • 进阶书籍:《Advanced Qt Programming》
  • 示例代码:Qt安装目录下的examples/openglexamples/widgets/painting

http://www.ppmy.cn/news/1581040.html

相关文章

基于 PHP+apache+MySql实现(Web)客户关系管理系统

小型 CRM 系统的开发 1 绪论 1.1 系统开发的背景 随着市场开放&#xff0c;各个企业之间的竞争逐渐加剧&#xff0c;并且也从独立的企业与企业之间的竞争发展成为了一个个群集之间的竞争。在这些群集中&#xff0c;不同的企业扮演着不同的角色&#xff0c;比如有原料供应商、…

ffmpeg库视频硬解码使用流程

FFmpeg 的硬解码&#xff08;Hardware Decoding&#xff09;通过调用 GPU 或专用硬件的编解码能力实现&#xff0c;能显著降低 CPU 占用率。 ‌一、FFmpeg 支持的硬件解码类型‌ FFmpeg 原生支持多种硬件加速类型&#xff0c;具体由 AVHWDeviceType 定义&#xff0c;包括&…

Python助力区块链互通——跨链桥接的实现与实践

Python助力区块链互通——跨链桥接的实现与实践 区块链技术的繁荣发展带来了巨大的生态创新,但也因各链之间的割裂局面限制了它们的潜力。例如,你或许想在以太坊上使用来自比特币的资产,却因两条链不互通而不得不求助于中心化交易所。要打破“链间壁垒”,跨链桥接(Cross-…

STM32配套程序接线图

1 工程模板 2 LED闪烁 3LED流水灯 4蜂鸣器 5按键控制LED 6光敏传感器控制蜂鸣器 7OLED显示屏 8对射式红外传感器计次 9旋转编码器计次 10 定时器定时中断 11定时器外部时钟 12PWM驱动LED呼吸灯 13 PWM驱动舵机 14 PWM驱动直流电机 15输入捕获模式测频率 16PWMI模式测频率占空…

JavaScript语法入门

目录 1. 变量声明 2. 数据类型 3. 运算符 4. 分支语句 5. 循环语句 6. 字符串 7. 数组 8. 对象 9. 原型与原型链 10. 常用内置对象 JavaScript 是一种轻量级、解释型的编程语言&#xff0c;广泛应用于网页开发中&#xff0c;用于增强网页的交互性。以下是 JavaScript…

deepseek连续对话与API调用机制

在调用DeepSeek等大模型进行连续对话时&#xff0c;是否需要每次上传系统提示和对话历史取决于API的设计机制。 一、API调用机制解析 无状态服务原则 DeepSeek的API基于无状态架构设计&#xff0c;每次请求视为独立会话。若需维持对话连续性&#xff0c;必须由客户端主动管理并…

如何利用爬虫获取1688商品详情API接口:从入门到实战

一、技术原理分析 API定位方法 使用Chrome开发者工具&#xff08;F12&#xff09;的Network面板筛选XHR/Fetch请求&#xff08;通常返回JSON数据&#xff09;通过关键词搜索&#xff08;如"itemDetail"&#xff09;观察请求参数中的商品ID&#xff08;offerId&…

Python学习第十九天

Django-分页 后端分页 Django提供了Paginator类来实现后端分页。Paginator类可以将一个查询集&#xff08;QuerySet&#xff09;分成多个页面&#xff0c;每个页面包含指定数量的对象。 from django.shortcuts import render, redirect, get_object_or_404 from .models impo…