qt绘图

Qt绘图学习指南

Qt提供了强大的2D绘图功能,主要通过QPainter类实现。以下是学习Qt绘图的核心内容和学习路径:

1. 基础绘图知识

核心类

  • QPainter:执行绘图操作的主要类
  • QPaintDevice:绘图设备的基类(QWidget, QImage, QPixmap等)
  • QPaintEngine:底层绘图接口

基本绘图步骤

void Widget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this); // 创建QPainter对象,绑定到当前widget
    
    // 设置画笔
    QPen pen(Qt::blue);
    pen.setWidth(2);
    painter.setPen(pen);
    
    // 设置画刷
    painter.setBrush(Qt::yellow);
    
    // 绘制图形
    painter.drawLine(10, 10, 100, 100); // 直线
    painter.drawRect(50, 50, 100, 100); // 矩形
    painter.drawEllipse(150, 150, 100, 100); // 椭圆
    
    // 绘制文本
    painter.drawText(200, 200, "Qt绘图示例");
}

2. 绘图功能详解

基本图形绘制

  • 线条drawLine()
  • 矩形drawRect()
  • 椭圆/圆drawEllipse()
  • 多边形drawPolygon()
  • 弧线drawArc()
  • 贝塞尔曲线drawBezier()

颜色和样式控制

  • QPen:控制线条样式、宽度、颜色等
  • QBrush:控制填充样式、颜色等
  • QColor:颜色表示
// 高级画笔设置示例
QPen pen;
pen.setColor(QColor(255, 0, 0, 127)); // 带透明度的红色
pen.setStyle(Qt::DashLine); // 虚线
pen.setCapStyle(Qt::RoundCap); // 线端圆角
pen.setJoinStyle(Qt::RoundJoin); // 连接点圆角
painter.setPen(pen);

坐标系统变换

  • 平移translate()
  • 缩放scale()
  • 旋转rotate()
  • 保存/恢复状态save()/restore()
painter.save(); // 保存当前状态
painter.translate(100, 100); // 平移坐标系
painter.rotate(45); // 旋转45度
painter.drawRect(0, 0, 50, 50); // 绘制旋转后的矩形
painter.restore(); // 恢复之前的状态

3. 高级绘图技术

双缓冲绘图

防止闪烁的技术:

void Widget::paintEvent(QPaintEvent *event)
{
    QPixmap pixmap(size()); // 创建与widget相同大小的pixmap
    QPainter bufferPainter(&pixmap);
    
    // 在pixmap上绘制所有内容
    bufferPainter.fillRect(rect(), Qt::white);
    // ...其他绘制操作
    
    // 最后将pixmap绘制到widget上
    QPainter painter(this);
    painter.drawPixmap(0, 0, pixmap);
}

自定义图形项

继承QGraphicsItem创建自定义图形:

class CustomItem : public QGraphicsItem {
public:
    QRectF boundingRect() const override {
        return QRectF(-50, -50, 100, 100);
    }
    
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) override {
        painter->setBrush(Qt::green);
        painter->drawEllipse(-50, -50, 100, 100);
    }
};

4. 学习资源推荐

官方文档

推荐书籍

  • 《Qt5开发及实例》
  • 《C++ GUI Qt4编程》

实践项目

  1. 实现一个简单的绘图程序(支持线条、矩形、椭圆等基本图形)
  2. 开发一个简易的图表绘制工具
  3. 创建一个自定义仪表盘控件

5. 常见问题解答

Q: 为什么我的绘图在窗口缩放时会变形?A: 需要重写resizeEvent()并调用update()强制重绘,或者使用QGraphicsView框架。

Q: 如何提高绘图性能?A: 1) 使用双缓冲技术 2) 只绘制需要更新的区域 3) 对于复杂图形,考虑使用OpenGL加速

Q: 如何实现图形的选择和移动?A: 使用QGraphicsView/QGraphicsScene框架会更方便,它内置了这些功能。

学习Qt绘图的关键是多实践,从简单图形开始,逐步尝试更复杂的效果和交互功能。

全部评论

相关推荐

07-31 10:04
已编辑
门头沟学院 Java
虽然工作后很少会去刷牛客了,但还是会阶段性的刷刷 看看当届大家都是什么情况,回味一下我那年找实习、秋招的场景哈哈哈。都是历历在目呢。作为毕业工作一年的老腊肉,首先在技术上、编码上的提升我认为这是最基础、最不值得聊的,这是日常的需求必然会带给你的成长,这一年就是夯实基础,做好crud的基本功。同样我觉得这也是刚毕业同学可能要做好的第一件事。其次就是在心态上的变化、在面对解决不了问题的时候、在并行需要同时去处理一些事情的时候,这种时候其实大多数情况是面临崩溃的,但是只能抗….使劲抗….心态真的很重要,要学会调节自己,放轻松,但这点我做的非常非常不好,所以很多时候非常情绪化,压力非常大,这也是我觉得互联网折磨人的地方。一方面是不确定自己能不能做出来的压力、一方面是需要给出排期、按时交付产出的压力。总之,在职场上,没有人把你再当小孩。在工作中,你面临的来自各方各面的压力等等等。如果老板同事比较好 还好说,有些老板纯恶心人这种。是真傻逼哦忘不了这一年一些痛苦具像化的一些画面和瞬间、刚开始做需求时难以上手的痛苦、中午饭都没心情吃,从早坐到晚搞一天,躺在床上想到要去上班的痛苦感、使劲捶床来宣泄自己的无力感。这都是非常难忘的瞬间,这一年和朋友说过最多的话应该就是:4了,不想上班。  哈哈哈哈哈哈哈哈哈哈 真的。但后面适应的话确实能好很多。大家加油landing吧。回味这一年,无限回味还在学校的时候啊哈哈哈哈哈。上班之后其实这种日子感觉就很难看到头,最多只能阶段性的停几天,但是总不能一辈子不工作吧哈哈哈哈哈。所以希望大家一切顺利呢。这是我早上起床后 在发呆 总想写点什么记录一下这一刻 希望看到的你找工作、找实习、工作。都一切顺利。牛客很好,常回来看看。都很有自己当年的影子 嘿嘿。配图:就发一些这一年里的一些 我觉得很喜欢的瞬间 (from pyq 还有一些喜欢的瞬间也也可以
分享一个让你热爱工作的瞬...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务