Qt 2D绘图功能简单总结

Qt 2D绘图功能简单总结

Qt 的绘图功能非常强大,它可以绘制一切想要的图形,从最简单的一条直线到其他任何复杂的图形,还可以用来绘制文本和图片。

Qt的绘图系统中由QPainter来完成具体的绘制操作。该类提供了大量高度优化的函数来完成GUI编程所需要的大部分绘制工作。

2D 绘图有两个思路:

  • 1、不使用Qt的视图框架。

    在一个部件重绘事件paintEvent()中绘制,首先创建QPainter对象,再进行图形的绘制,最后程序结束自动销毁QPaint对象。
    

例如:

 void SimpleExampleWidget::paintEvent(QPaintEvent *)
 {
     QPainter painter(this);
     painter.setPen(Qt::blue);
     painter.setFont(QFont("Arial", 30));
     painter.drawText(rect(), Qt::AlignCenter, "Qt");
 }

**

  • 2、运用Qt的视图框架,在场景中添加图形项。可以直接添加,或者间接添加

2.1 直接添加

例如:在场景中直接添加一个多边形。

 QPolygonF myPolygon;

  myPolygon <<QPointF(-8, 8)<<QPointF(8, 8)<<QPointF(0,-8);
   //这里的_scene 是QGraphicsScene *_scene的对象。
 QAbstractGraphicsShapeItem *tag_pt = _scene->addPolygon(myPolygon);
 

2.2 间接添加
图形项可以通过鼠标绘制,可以预先绘制好,但是绘制部分还是需要QPainter来实现。

例如:创建一个一个图形项,继承QGraphicsItem

class AncItem: public QGraphicsItem
{
public:
    AncItem();
    QRectF boundingRect() const;
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
                  QWidget *widget);
    void setColor(const QColor &color) { brushColor = color; }

    void  setAncColor(bool active);

protected:
  //  void keyPressEvent(QKeyEvent *event);
    void mousePressEvent(QGraphicsSceneMouseEvent *event);
 //   void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
  //  void contextMenuEvent(QGraphicsSceneContextMenuEvent *event);

private:
    QColor brushColor;
};

然后在Paint()函数中绘制图形

void AncItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
                   QWidget *widget)
{

   // 设置画笔颜色、宽度
    painter->setPen(QPen(QColor(255,255,0),2));
    painter->setBrush(brushColor);

    /*-------绘制三角形---------*/
    static const QPointF points[3] = {QPointF(-8, -8), QPointF(8, -8), QPointF(0,12)};
     painter->drawPolygon(points, 3);

     /*---------------绘制三条弧线-------------*/
     // 反走样
     painter->setRenderHint(QPainter::Antialiasing, true);
     // 设置画笔颜色、宽度
     painter->setPen(QPen(QColor(255, 0, 230), 2));

       QRectF rect(-15, -15, 30, 30);
       // 起始角度
       int startAngle = -60 * 16;
       // 跨越度数
       int spanAngle = -65 * 16;
       // 绘制弧线
       painter->drawArc(rect, startAngle, spanAngle);

       rect.setRect(-20, -20, 40, 40);
       // 起始角度
       startAngle = -60 * 16;
       // 跨越度数
       spanAngle = -65 * 16;
       // 绘制弧线
       painter->drawArc(rect, startAngle, spanAngle);

       rect.setRect(-25, -25, 50, 50);
       // 起始角度
       startAngle = -60 * 16;
       // 跨越度数
       spanAngle = -65 * 16;
       // 绘制弧线
       painter->drawArc(rect, startAngle, spanAngle);

}

2D绘图会涉及到这样几个方面的内容:
1、基本图形绘制和填充。

2、图形的位置关系,坐标系统如何建立的?

3、文字和路径可以绘制吗?

4、图像如Pixmap,Image 等是如何处理?

5、图像的滤镜等算法如何处理?

6、重绘事件如何处理,如何展现动画?

这些内容都在QPainter类中可以可以实现,绘制的过程,一般也都是先设置(Settings),设置笔刷,设置画笔等,然后操作(Drawing), Qt 官方提供了一个示例 Basic Drawing example。可以很好地借鉴。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值