QT 图形绘制大全

北战南征 提交于 2020-10-18 03:18:34

 

1. 绘制图形

  1. protected:

  2. void paintEvent(QPaintEvent *);

  3.  
  4. void Widget::paintEvent((QPaintEvent *event)

  5. {

  6. QPainter painter(this); //this为绘图设备,即表明在该部件上进行绘制

  7. painter.drawLine(QPaint(0, 0), QPaint(100, 100));

  8. }

QPainter painter(this); // 会立即开始在设备上绘制,自动调用begin()函数,然后析构函数中调用end()函数结束绘制。
QPainter painter;// 不带参数时,可以在后面调用QPainter::begin(QPaintDevice *device)来指定绘制设置,然后用完再调用end()函数。

等价于


 
  1. void Widget::paintEvent((QPaintEvent *event)

  2. {

  3. QPainter painter;

  4. painter.begin(this);

  5. painter.drawLine(QPaint(0, 0), QPaint(100, 100));

  6. painter.end();

  7. }

2. 使用画刷
画刷可以设置颜色和填充模式

 
  1. QBrush brush(QColor(0,0,255), Qt::Dense4Pattern);

  2. painter.setBrush(brush);

3. 使用画笔

 
  1. //参数为:画刷,线宽,画笔风格,画笔端点,画笔连接风格

  2. QPen pen(Qt::green, 5, Qt::DotLine, Qt::RoundCap, Qt::RoundJoin);

  3. painter.setPen(pen);

4. 绘制矩形

painter.drawRect(0, 0, 100, 80); //x,y,w,h

5. 绘制椭圆(圆)

painter.drawEllipse(0, 0, 100, 80); //x,y,w,h

6. 绘制圆弧

 
  1. QRectF rect(70.0, 40.0, 80.0, 60.0); //x,y,w,h

  2. int startAngle = 30 * 16; //值为,实际角度 * 16

  3. int spanAngle = 120 * 16;

  4.  
  5. //三个参数:rect表示弧线所在的矩形,startAngle起始角度,spanAngle跨越角度

  6. painter.drawArc(rect, startAngle, spanAngle);


7. 绘制扇形

 
  1. QRectF rect_top(20.0, 20.0, 100.0, 100.0);

  2.  
  3. // 扇形起始角度

  4. int startAngle = 0 * 16;

  5. // 扇形覆盖范围(120度的)

  6. int spanAngle = 120 * 16;

  7. painter.drawPie(rect_top, startAngle, spanAngle);

8. 绘制多边形

 
  1. QPolygon pts;

  2. pts.setPoints(3, -1,0, 1,0, 0,39); //第一个参数表示3个点,后面是三个点坐标

  3. painter.drawConvexPolygon(pts);

9. 绘制路径

 
  1. QPainterPath path;

  2. path.addEllipse(-4, -4, 8, 8);//添加一个圆

  3. path.addRect(-5, -5, 10, 10); //添加一个矩形

  4. painter.drawPath(path);

在填充路径时要用到填充规则,这里一共有两个填充规则
path.setFillRule(Qt::OddEventFil);//奇偶填充规则
如果要判断一个点是否在图形中,可以从该点向图形外引一条水平线,如果该水平线与图形的交点人个数为奇数,那么该点在在图形中。
只填充在图形内的点
path.setFillRule(Qt::WindingFill); //非零弯曲规则
如果要判断一个点是否在图形中,可以从该点向图形外引一条水平线,如果该水平线与图形的边线相交,这个边线是顺时针绘制的,就记为1,是逆时针绘制的就记为-1,然后将所有数值相加,结果不为0,那么该点就在图形中。


10. 绘制圆环
根据以上的填充规则,可以得到绘制圆环的一个方便的方法








 
  1. QPainterPath path;

  2. path.addEllipse(0,0,100,100);

  3. path.addEllipse(25,25,50,50);

  4. painter.setBrush(Qt::blue);

  5. path.setFillRule(Qt::OddEventFil);//使用奇偶填充,刚好可以只显示圆环

  6. painter.drawPath(path);

11. 填充与擦除

 
  1. //使用画刷填充一个矩形区域

  2. painter.fillRect(QRect(10,100,150,20), QBrush(Qt::darkYellow));

  3.  
  4. //擦除一个矩形区域的内容

  5. painter.eraserRect(QRect(50,0,50,120));

  6. //绘制曲线************************************************************************************

  7. 功能描述:用曲线来显示数据的变化情况。横坐标表示时间T,纵坐标Y。每隔一定时间取一个Y值确定纵坐标

     

    点击(此处)折叠或打开

    1. #include "dialog.h"
    2. #include "ui_dialog.h"
    3. Dialog::Dialog(QWidget *parent) :
    4.     QDialog(parent),
    5.     ui(new Ui::Dialog)
    6. {
    7.     ui->setupUi(this);
    8. // resize(600,500); //窗口大小设置为600*500
    9.     p = t = 0;
    10.     Point.setX(0); /* 初始化起始点的纵坐标为0 */
    11.     Point.setY(0); /* 初始化起始点的横坐标为0 */
    12.     path = new QPainterPath;
    13.     timer = new QTimer(this);
    14.     connect(timer,SIGNAL(timeout()),this,SLOT(timerUpDate())); //关联定时器计满信号和相应的槽函数
    15.     timer->start(500);
    16. }
    17. Dialog::~Dialog()
    18. {
    19.     delete ui;
    20. }
    21. /* 定时时间到 */
    22. void Dialog::timerUpDate()
    23. {
    24.     t += 10;
    25.     Point.setX(t); /* 时间加二秒 */
    26.     Point.setY(qrand() % 100); /* 设置纵坐标值 */
    27.     path->lineTo(Point); /* */
    28.     if(> width()) /* 当时间值 T大于窗口的宽度时需调整坐标原点 */
    29.         p -= 10; /* 调整坐标原点 */
    30.     update();
    31. }
    32. /* 开启绘画曲线 也就是开启定时器 */
    33. void Dialog::startPainting(void)
    34. {
    35.     timer->start(2000);
    36. }
    37. /* 停止绘画曲线 也就是停止定时器 */
    38. void Dialog::closePainting(void)
    39. {
    40.     timer->stop();
    41. }
    42. /* 重绘事件函数 */
    43. void Dialog::paintEvent(QPaintEvent *)
    44. {
    45.     QPainter painter(this);
    46.     painter.setPen(QPen(Qt::red, 2)); //设置画笔颜色和大小
    47.     painter.translate(p,0); //调整坐标原点
    48.     painter.drawPath(*path); /* 绘制路径 */
    49. }

    QT 绘制事件 PaintEvent

    对事件的响应是通过信号与槽调用

         事件中根据事件触发的条件发出不同的信号

         比如:鼠标事件发出clicked与dblclicked等信号

        

    QT中事件是怎么实现的?

      QT把事件自己定义成固定的virtual保护函数

      这些函数自动被系统调用

     

    1.      paintEvent

    案例:

    1.      覆盖QWidget的paintEvent

    绘制gdi(Graphics DrawInterface)

    代码:

    main.cpp

    #include<QApplication>

    #include<QWidget>

    #include “PaintWidget.h”

    int  main(int  args , char  **argv)

    {

        QApplication  app(args , argv);

        PaintWidget w;

        w.resize(400,400);

        w.setVisible(true);

         return  app.exec();

    }

     

    main.pro

    TEMPLATE=app

    SOURCES=main.cpp PaintWidget.cpp

    HEADERS=PaintWidget.h

    CONFIG=release qt

    QT=core gui

    TARGET=main

     

     

    PaintWidget.h

    #ifndef PAINT_WIDGET_H

    #define PAINT_WIDGET_H

    #include<QWidget>

    #include<QPaintEvent>

    class PaintWidget:public QWidget

    {

    protected:

          virtual void paintEvent( QPaintEvent * e);

    };

    #endif

     

    PaintWidget.cpp

     

    #include “PaintWidget.h”

    #include<QPainter>

    #include<QPoint>

    #include<QImage>

    #include<QPixmap>

    #include<QBitmap>

    #include<QPen>

     

    void PaintWidget::paintEvent(QPaintEvent * e)

    {

         QPoint p[3];

         p[0].setX(10);

         p[0].setY(10);

         p[1].setX(300);

         p[1].setY(10);

         p[2].setX(145);

         p[2].setY(200);

         QImage img(“ok.png”);

         QPixmap  map(“ok.png”);

         QBitmap  bit=map.createMaskFromColor(QColor(0,0,0));

    //     QPen pen(QColor(255,0,0));

         QBrush br(QColor(0,255,0));

          QPen pen();

         

          //纯黑色设置为透明

         //进行绘制工作

         //1.产生绘制对象QPainter

         QPainter  g(this);  //this参数指定绘制的目标

         //2.设置绘制对象的属性

         g.setPen(pen);

         g.setFont(“楷书”,45,100);   //设置字体

         //3.进行绘制:图形,图像与字符串

         g.drawLine(10,10,400,400);

         g.drawArc(10,10,300,300,10*16,120*16);

         //前4个参数为弧的外切矩形,参数5,6为起始角度和结束角度,1/16度数

         g.drawConvexPolygon(p,3);  //参数2为多边形的顶点个数

         g.drawEllipase(0,0,this->width(),this->height());

         g.drawText(100,100, “this is a maomaochong”);

         g.drawImage(10,10,img);

          g.drawPixmap(10,10,300,300,bit); 

    }

     

     

     

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!