Qt 绘图QPainter < 二 >

本文详细介绍了在Qt中使用QPainter进行图形绘制的基本操作,包括绘制线段、散点、多边形等形状,以及设置画笔和画刷的样式,同时涵盖了坐标变换如平移、旋转和缩放的重要性。
摘要由CSDN通过智能技术生成

Qt 绘图QPainter < 二 >


这里是对 QPainter样例进行补充,以下是一些基本图形绘制、画笔和画刷设置,以及坐标变换的功能及其部分解释:

1. 绘制基本图形:

1.1 线段 (drawLine):
// 绘制直线段,参数为两个端点的坐标
painter.drawLine(QPointF(10, 10), QPointF(100, 100));
1.2 散点 (drawPoint):
// 绘制单个点,可用于标记某一位置或在绘制中的辅助点
painter.drawPoint(50, 50);
1.3 多线段 (drawPolyline):
// 绘制折线,通过连接多个点形成线段
QPointF points[] = {QPointF(20, 20), QPointF(50, 80), QPointF(80, 20)};
painter.drawPolyline(points, 3);
1.4 多边形 (drawPolygon):
// 绘制多边形,通过连接多个点形成闭合区域
QPointF points[] = {QPointF(20, 20), QPointF(50, 80), QPointF(80, 20)};
painter.drawPolygon(points, 3);
1.5 矩形 (drawRect):
// 绘制矩形,参数为矩形左上角的坐标和宽高
painter.drawRect(20, 20, 60, 40);
1.6 圆角矩形 (drawRoundRect):
// 绘制圆角矩形,除了矩形参数外,还有圆角的横向和纵向半径
painter.drawRoundRect(20, 20, 60, 40, 10, 10);
1.7 椭圆 (drawEllipse):
// 绘制椭圆,参数为椭圆外接矩形的左上角坐标和宽高
painter.drawEllipse(20, 20, 60, 40);
1.8 弧线 (drawArc):
// 绘制弧线,参数为弧线外接椭圆的左上角坐标、宽高和起始角度与跨度
painter.drawArc(20, 20, 60, 40, 30 * 16, 120 * 16);
1.9 弦形 (drawChord):
// 绘制弦形,与弧线类似,但会封闭弧线形成弦形
painter.drawChord(20, 20, 60, 40, 30 * 16, 120 * 16);
1.10 扇形 (drawPie):
// 绘制扇形,与弧线类似,但会封闭形成扇形
painter.drawPie(20, 20, 60, 40, 30 * 16, 120 * 16);
1.11 绘制路径 (drawPath)(更多见<三>):
// 使用路径对象进行绘制,路径可以包含多个线段、曲线段等
QPainterPath path;
path.moveTo(10, 10);
path.lineTo(50, 80);
path.lineTo(90, 10);
painter.drawPath(path);
1.12 文字 (drawText):
// 在指定位置绘制文本,可以设置字体、大小等属性
painter.drawText(20, 20, "Hello, Qt!");
1.13 图片 (drawImage):
// 在指定位置绘制图片,参数为图片对象
QImage image("path/to/image.png");
painter.drawImage(20, 20, image);

2. 设置画笔和画刷详解:

在Qt中,画笔(QPen)和画刷(QBrush)是绘图外观控制的关键元素。画笔用于定义线条的样式、颜色等属性,而画刷则用于填充封闭图形的区域。以下是对设置画笔和画刷的讲解。

2.1. 画笔(QPen):

2.1.1 颜色 (setColor):

设置画笔的颜色。颜色可以使用Qt预定义的颜色,也可以使用RGB值。

QPen pen;
pen.setColor(Qt::red); // 使用Qt预定义的颜色
// 或者
pen.setColor(QColor(255, 0, 0)); // 使用RGB值

2.1.2 线条样式 (setStyle):

设置线条的样式,如实线、虚线、点线等。

pen.setStyle(Qt::DashLine); // 设置为虚线

2.1.3 线宽 (setWidth):

设置线条的宽度。

pen.setWidth(2); // 设置线宽为2像素

2.1.4 端点样式 (setCapStyle):

设置线条端点的样式,如平头、圆头等。

pen.setCapStyle(Qt::RoundCap); // 设置为圆头

2.1.5 连接样式 (setJoinStyle):

设置线条连接点的样式,如圆角连接等。

pen.setJoinStyle(Qt::RoundJoin); // 设置为圆角连接

2.1.6 虚线模式 (setDashPattern):

设置虚线模式,即定义虚线的样式。

pen.setDashPattern({4, 4}); // 设置为交替4像素的实线和虚线

2.1.7 透明度 (setOpacity):

设置画笔的透明度。

pen.setOpacity(0.7); // 设置透明度为0.7
2.2. 画刷(QBrush):

2.2.1 颜色 (setColor):

设置画刷的颜色。

QBrush brush;
brush.setColor(Qt::green); // 使用Qt预定义的颜色
// 或者
brush.setColor(QColor(0, 255, 0)); // 使用RGB值

2.2.2 图案样式 (setStyle):

设置填充区域的图案样式,如实体填充、横线填充等。

brush.setStyle(Qt::CrossPattern); // 设置为十字叉图案

2.2.3 渐变填充 (setGradient):

设置渐变填充。

QLinearGradient gradient(0, 0, 100, 100);
gradient.setColorAt(0, Qt::red);
gradient.setColorAt(1, Qt::yellow);
brush = QBrush(gradient);

2.2.4 贴图填充 (setTexture):

使用一张图片作为填充图案。

QPixmap pixmap("path/to/image.png");
brush.setTexture(pixmap);

2.2.5 透明度 (setOpacity):

设置画刷的透明度。

brush.setOpacity(0.5); // 设置透明度为0.5
2.3. 应用到绘图:

将设置好的画笔和画刷应用到QPainter对象上。

QPainter painter(this);
painter.setPen(pen);   // 应用画笔
painter.setBrush(brush); // 应用画刷
// 进行绘制操作...

这些设置可以根据具体的需求进行组合和调整,使得绘制的图形更加多样化和灵活。在绘图过程中,合理配置画笔和画刷是实现丰富图形效果的关键。

3. 坐标变换:

3.1 原点水平、垂直偏移 (translate):
// 平移坐标系,改变原点的位置
painter.translate(20, 20);
3.2 旋转 (rotate):
// 以原点为中心旋转坐标系
painter.rotate(45);
3.3 缩放 (scale):
// 缩放坐标系,影响所有后续的绘制
painter.scale(2, 2);

这些功能的灵活使用可以实现丰富多彩的图形,而坐标变换的运用使得在绘图中更加方便实现复杂的效果。

  • 18
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
画出GraphItem类的UML类图: #ifndef GRAPHITEM_H #define GRAPHITEM_H #include <QGraphicsItem> #include <QVector> #include <QPointF> #include <QtMath> #include <QTimer> #include <QPaintEvent> #include <QPushButton> #include "mainwindow.h" #include <QObject> class MainWindow; // 前向声明 class GraphItem : public QGraphicsItem { public: //构造函数,接受带权无向图临界矩阵adjMatrix和一个parent GraphItem(const QVector<QVector<int>> &adjMatrix, const QVector<int> &shortestPath, QGraphicsItem *parent = nullptr); //纯虚函数,在.cpp中重新编写以实现图形项的边界框绘制 QRectF boundingRect() const override; void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; QVector<QPointF> m_nodePositions;//存储节点的位置信息 QVector<int> m_shortestPath; // 最短路径 QVector<int> m_userCity; QVector<int> m_userSchool; bool m_drawArrow; // 是否需要绘制箭头 bool m_draw1; bool m_draw2; bool m_draw3; private: MainWindow * m_mainWindow; // 指向MainWindow对象的指针 QVector<QVector<int>> m_adjMatrix;//存储带权无向图的邻接矩阵 QPointF startPoint; QPointF endPoint; QPainter * m_painter; QPainter * m_drawNodes; void initializeNodePositions();//初始化节点位置信息 void drawEdges(QPainter * painter);//用于绘制边 void drawNodes1(QPainter * painter);//用于绘制节点 void drawNodes2(QPainter * painter);//用于绘制节点 void drawNodes3(QPainter * painter);//用于绘制节点 void paintArrow(QPainter * painter); }; #endif // GRAPHITEM_H
07-14
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值