【Qt开发】绘图

目录

1,绘图的基本概念

2,绘制各种形状

3,设置画笔

4,设置画刷

5,绘制图片


1,绘图的基本概念

        Qt 提供了画图相关的 API,可以允许我们在窗口上绘制任意的图形形状,来完成更复杂的界⾯设计,这就是 Qt 绘图。绘图 API 核心类如下:

         绘图 API 的使用,⼀般不会在 QWidget 的构造函数中使用,而是要放到 paintEvent 事件中。paintEvent 会在以下情况下被触发:

  • 控件⾸次创建
  • 控件被遮挡,再解除遮挡
  • 窗口最小化,再恢复
  • 控件大小发⽣变化时
  • 主动调用 repaint() 或者 update() 方法。(这两个方法都是 QWidget 的方法)

2,绘制各种形状

绘制线段:

        void QPainter::drawLine(const QPoint &p1, const QPoint &p2);

        void QPainter::drawLine(int x1, int y1, int x2, int y2);

参数:

        p1:绘制起点坐标;p2:绘制终点坐标

        x1,y1:绘制起点坐标;x2,y2:绘制终点坐标

绘制矩形:

        void QPainter::drawRect(int x, int y, int width, int height);

参数:

        x:窗⼝横坐标;

        y:窗⼝纵坐标;

        width:所绘制矩形的宽度;

        height:所绘制矩形的⾼度;

绘制圆:

        void QPainter::drawEllipse(const QPoint &center, int rx, int ry)

参数:

        center:中心点坐标

        rx:横坐标

        ry:纵坐标

      

绘制文本:

        void QPainter::drawText(int x, int y, const QString& s);

        QPainter::drawText() 函数来绘制⽂字,也可 以使⽤QPainter::setFont()设置字体等信息。

参数:

        x:窗⼝横坐标;

        y:窗⼝纵坐标;

        s:文本;

QPainter painter(this);

// 画线段

painter.drawLine(20, 20, 200, 20);

painter.drawLine(QPoint(20, 50), QPoint(200, 50));

// 画矩形

painter.drawRect(50, 80, 100, 80); 

// 画一个圆

painter.drawEllipse(50, 170, 50, 50); // 圆形

painter.drawEllipse(50, 250, 80, 50);  // 椭圆

// 使用上面设置的painter,绘制⽂本

// 注意:没有画图绘制的文本将没有任何“艺术样式”效果

QFont font("微软雅黑", 20); // 设置字体

painter.setFont(font);

painter.drawText(0, 350, "欢迎来到Qt");

// 或者painter.drawText(QRect(100,200,600,150), "欢迎来到Qt");

3,设置画笔

        QPainter在绘制时,是有一个默认的画笔的。在使用时也可以⾃定义画笔。在 Qt 中,QPen类中定义了 QPainter 应该如何绘制形状、线条和轮廓。同时通过 QPen类可以设置画笔的线宽、颜⾊、样式、 画刷等。

        画笔的颜⾊可以在实例化画笔对象时进⾏设置,画笔的宽度是通过 setWidth() ⽅法进⾏设置,画笔的⻛格是通过 setStyle() ⽅法进⾏设置,设置画刷主要是通过 setBrush() ⽅法。

设置画笔颜⾊:QPen::QPen(const QColor& color) 画笔的颜⾊主要是通过 QColor 类设置

设置画笔宽度:void QPen::setWidth(int width)

设置画笔⻛格:void QPen::setStyle(Qt::PenStyle style)

        画笔的风格有如下:

QPainter painter(this);

// 画一个圆,使用画笔

QPen pen;  // 设置画笔

pen.setColor(QColor(255, 0, 0)); // 设置红色的线条

pen.setWidth(5);  // 设置画笔的宽度,即粗细

pen.setStyle(Qt::DashLine); // 设置线条的风格

painter.setPen(pen); // 使用画笔风格

painter.drawEllipse(50, 170, 50, 50); // 圆形

painter.drawEllipse(50, 250, 80, 50);  // 椭圆

4,设置画刷

        在 Qt 中,画刷是使⽤ QBrush类来描述,画刷大多用于填充。QBrush定义了QPainter的填充模式,具有样式、颜色、渐变等属性。

        画刷的格式中定义了填充的样式,使⽤ Qt::BrushStyle 枚举,默认值是 Qt::NoBrush,也就是不进行任何填充。可以通过 Qt 助⼿查找画刷的格式。如下图示:

        设置画刷主要通过 void QPen::setBrush(const QBrush& brush) 方法,其参数为画刷的格式。

QPainter painter(this);

// 画一个圆,且使用画刷和画笔

// 设置画刷

QBrush brush;

brush.setColor(QColor(0, 255, 0));

brush.setStyle(Qt::SolidPattern);

painter.setBrush(brush);

// 设置画笔

QPen pen;  

pen.setColor(QColor(255, 0, 0)); // 设置红色的线条

pen.setWidth(5);  // 设置画笔的宽度,即粗细

pen.setStyle(Qt::DashLine); // 设置线条的风格

painter.setPen(pen);

painter.drawEllipse(50, 170, 50, 50); // 圆形

painter.drawEllipse(50, 250, 80, 50);  // 椭圆

5,绘制图片

        Qt 提供了四个类来处理图像数据:QImage、QPixmap、QBitmap和QPicture。这里只说明QPixmap。QPixmap主要⽤来在屏幕上显示图像,它对在屏幕上显示图像进行了优化。

        QPainter 中提供了 drawPixmap 方法设置图片;提供了 translate() 函数来实现坐标原点的改变;提供了 rotate()函数进行旋转。其中,rotate()函数默认是以原点为中心进行旋转的,如果要改变旋转的中心,可以使用 translate()函数完成。

语法:

        void QPainter::drawPixmap(int x, int y, int w, int h, const QPixmap& pm);

        void QPainter::translate(qreal dx, qreal dy)

        void QPainter::rotate(qreal angle)  

        要旋转的角度angle正值表示顺时针方向旋转,负值表示逆时针方向旋转

样例:

        QPainter painter(this);

        QPixmap pixmap(":/a.jpg");

        // 将绘图设备的坐标系原点 (0, 0) 平移到新的位置 (20, 20), 即重设坐标系

        painter.translate(20, 20); 

        // 图片旋转。本质上是把QPainter对象进行旋转,这样绘制的内容就产生了旋转

        painter.rotate(360); // 等于没旋转

        // 在(250,100)处绘图,且将图片缩放成400*300

        painter.drawPixmap(250, 100, 400, 300, pixmap); 

        // painter.drawPixmap(250, 100, pixmap); // 在(250,100)处绘图,图片大小等于原本图片大小

        painter.translate(100, 100);

        下面可再设计其它图形等 

### 关于Qt绘图界面开发的教程与示例 在Qt框架下进行绘图界面开发是一项常见的需求,可以通过重写`paintEvent`函数来实现自定义绘制功能。以下是基于提供的参考资料以及专业知识整理的内容。 #### 自定义绘图基础 通过继承`QWidget`并重写其保护成员函数`paintEvent`可以完成基本的绘图操作[^3]。以下是一个简单的例子: ```cpp #include <QPainter> #include <QPaintEvent> void Widget::paintEvent(QPaintEvent *event) { QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); // 抗锯齿效果 // 绘制矩形 painter.drawRect(10, 10, 100, 50); // 设置画笔颜色 painter.setPen(Qt::red); // 绘制圆形 painter.drawEllipse(120, 10, 50, 50); } ``` 上述代码展示了如何在一个窗口部件上绘制矩形和椭圆,并设置了抗锯齿选项以提高图形质量。 #### 高级绘图技术 对于更复杂的绘图场景,可以利用Qt中的其他绘图类,例如`QGraphicsView`和`QGraphicsScene`组合使用,提供更为灵活的二维图形视图架构[^1]。此外,在实际项目中可能还需要考虑性能优化问题,这方面的深入学习可以从专门的视频课程入手[^2]。 #### 完整实例解析 如果希望获得更加系统的指导,则推荐查阅《QT5软件开发入门到项目实战》这本书籍及其附带的源码资源[^4]。书中不仅讲解了基础知识还提供了大量实用案例供读者模仿练习。 #### 注意事项 当处理鼠标点击或者键盘输入事件时也需要相应地覆盖这些方法以便交互控制。比如下面这个片段演示了捕获鼠标的坐标位置并通过信号传递出去的功能: ```cpp void Widget::mousePressEvent(QMouseEvent *event){ int x=event->x(); int y=event->y(); emit mouseIndexChange(x,y); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值