首页 > 其他分享 >08. Qt绘图

08. Qt绘图

时间:2022-08-17 19:55:16浏览次数:51  
标签:lg end Qt 08 绘图 QPainter event painter

Qt绘图

1.QPainter

  • 2D绘图离不开QPainter,可以把QPainter想象成一个画笔,开发人员拿着画笔理论上是可以绘制任何 你想要的图形。QPainter 一般在一个部件(widget)重绘事件(PaintEvent )的处理函数paintEvent () 中进行绘制,首先要创建QPainter 对象(画笔),然后进行图形的绘制

1.1常用函数

        drawArc() 弧 
        drawChord() 弦 
        drawConvexPolygon() 凸多边形 
        drawEllipse() 椭圆,注意椭圆是先整个框,然后逼近
        drawImage() 图像 
        drawLine() 线 
        drawLines() 多条线 
        drawPath()路径; 想到哪就去哪,但是必须是直的 
        drawPicture() 按QPainter指令绘制 区分drawImage、drawPixmap 
        drawPie() 扇形 
        drawPixmap() 图像 
        drawPoint() 点 
        drawPoints() 多个点
        drawPolygon()多边形 
        drawPolyline() 多折线 
        drawRect() 矩形 
        drawRects() 多个矩形
        drawRoundRect() 圆角矩形 
        drawText() 文字 
        drawTiledPixmap() 平铺图像
        drawLineSegments() 绘制折线

1.2画图和画刷

  • QPen和QBrush

1.3paintEvent什么时候调用

//1、窗口隐藏和显示
//2、出窗口大小改变
//3、调用update()
//4、调用repaint()

1.4QPainter中的scale

  • 同比缩放,1表示不变,1.2表示1.2倍(放大),0.5表示0.5倍(缩放)
scale(qreal sx, qreal sy)
sx = x  //方向scale的倍数
sy = y  //方向scale的倍数

1.5QPainter中的save和restore

  • 在2D绘制中经常遇到画笔坐标轴移动 画笔换色等等操作,在切换另一种操作前,需要先save一次,完 成后再restore一次。

2.基本绘制操作

2.1绘制文字

QPainter painter;
QFont font;		//字体
QColor color;	//颜色
QPen pen;		//画笔
void Widget::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);		//用来避免警告的,可加可不加
    painter.begin(this);
    color.setRgb(255,0,0);
    painter.setPen(color);
    font.setFamily("黑体");
    font.setPointSize(44);
    font.setItalic(true);	//斜体
    painter.setFont(font);	//设置字体
    painter.drawText(rect(),Qt::AlignCenter,"内容");
    painter.end();
}

2.2绘制直线

  • 反锯齿(英语:anti-aliasing,简称AA),也译为抗锯齿或边缘柔化、消除混叠、抗图像折叠有损 等。它是一种消除显示器输出的画面中图物边缘出现凹凸锯齿的技术,QPaint er 进行绘制时可以使用 QPainter::RenderHint 渲染提示来指定是否要使用抗锯齿功能enderHint 取值分为以下三种。(这功能是 在显卡中完成的)
常量 描述
QPainter::Antialiasing 边缘抗锯齿
QPainter::TextAntialiasing 文字抗锯齿
QPainter::SmoothPixmapTransform 平滑Pixmap转换算法抗锯齿
void Widget::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);
    painter.begin(this);
    painter.setRenderHint(QPainter::Antialiasing,true);	//设置反锯齿
    pen.setWidth(10);
    pen.setColor(QColor(255,255,0));
    painter.setPen(pen);								//设置笔的大小
    painter.drawLine(50,50,100,100);					//起点和终点
    painter.end();
}

2.3绘制矩形

void Widget::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);
    painter.begin(this);
    painter.drawRect(50,50,100,100);
    painter.end();
}

2.4绘制弧

void Widget::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);
    painter.begin(this);
    QRectF rectangle(10.0, 20.0, 80.0, 60.0);
    int startAngle = 30 * 16;
    int spanAngle = 120 * 16;
    //用的时候可以查帮助文档
    painter.drawArc(rectangle, startAngle, spanAngle);
    painter.end();
}

2.5绘制椭圆

void Widget::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);
    painter.begin(this);
    QRectF rectangle(10.0, 20.0, 80.0, 60.0);//如果是一个正方形那就是一个圆
    painter.drawEllipse(rectangle);
    painter.end();
}

2.6绘制多边形

  • 官方文件里面用QPainter painter(this);代替了begin和end
void Widget::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);
    painter.begin(this);
    static const QPointF points[4] = {
        QPointF(10.0, 80.0),
        QPointF(20.0, 10.0),
        QPointF(80.0, 30.0),
        QPointF(90.0, 70.0)
    };
    painter.drawConvexPolygon(points, 4);
    painter.end();
}

2.7绘制路径

void Widget::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);
    painter.begin(this);
    QPainterPath path;
    path.moveTo(20, 80);
    path.lineTo(20, 30);
    path.cubicTo(80, 0, 50, 50, 80, 80);
    painter.drawPath(path);
    painter.end();
}

2.8绘图

  • drawImage

    void Widget::paintEvent(QPaintEvent *event)
    {
        Q_UNUSED(event);
        painter.begin(this);
        //painter.drawImage(0,0,QImage(":/1002256.jpg"));	//整张图贴上来
        QRect rect(0,0,this->width(),this->height());		//固定这个矩形这么大,会缩放
        painter.drawImage(rect,QImage(":/1002256.jpg"));
        painter.end();
    }
    
  • drawPicture

    void Widget::paintEvent(QPaintEvent *event)
    {
        Q_UNUSED(event);
        painter.begin(this);
        QPicture picture;
        picture.load("my.pic");//加载的是pic格式的图片,如果是jpg/png那么是没有效果的
        painter.drawPicture(0,0,picture);
        painter.end();
    }
    
  • drawPixmap

    void Widget::paintEvent(QPaintEvent *event)
    {
        Q_UNUSED(event);
        painter.begin(this);
        painter.drawPixmap(0,0,width(),height(),QPixmap(":/chudai.png"));
        painter.end();
    }
    
  • 得到pic格式图片

    //在构造函数中
    QPicture picture;
    QPainter painter;
    painter.begin(&picture);//指在picture上面画图
    painter.drawEllipse(0,0,width(),height());//画的是一个窗口大小的圆
    painter.end();
    picture.save("my.pic");//结束之后再保存
    
  • 截取一部分图片

    #include <QImageReader>
    QImageReader reader;
    reader.setFileName("c:\\1.png");
    reader.setScaledClipRect(QRect(0,0,100,100)); 	//获取的是矩形大小
    QImage img=reader.read();						//加载到img中
    QPixmap::fromImage(img); 						//会返回pixmap个数的图片
    //QPixmap转img 调用toImage()成员返回的是QImage
    

2.9渐变和填充

void Widget::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);
    painter.begin(this);
    QLinearGradient lg(10,10,200,200);				//定义一个大小,要填充多少就写多大
    lg.setColorAt(0.1,Qt::red);
    lg.setColorAt(0.2,Qt::green);
    lg.setColorAt(0.3,Qt::red);
    lg.setColorAt(0.4,Qt::green);
    lg.setColorAt(0.5,Qt::red);
    lg.setColorAt(0.6,Qt::green);
    lg.setColorAt(0.7,Qt::red);
    lg.setColorAt(0.8,Qt::green);
    lg.setColorAt(0.9,Qt::red);
    lg.setColorAt(1.0,Qt::green);
    painter.fillRect(10,10,200,200,QBrush(lg));		//相对应的画多大
    painter.end();
}
//可以把这个填充的部分理解成分成了10个部分,然后一个部分一个部分的填充

void Widget::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);
    painter.begin(this);
    QConicalGradient lg(200,200,120);
    lg.setColorAt(0,Qt::red);
    lg.setColorAt(0.5,Qt::blue);
    lg.setColorAt(1,Qt::green);
    painter.setBrush(lg);
    painter.drawEllipse(0,0,400,400);
    painter.end();
}

标签:lg,end,Qt,08,绘图,QPainter,event,painter
From: https://www.cnblogs.com/WZ-1120232314/p/16596560.html

相关文章

  • 【2022-08-17】mysql基础知识(四)
    mysql基础知识(四)mysql之操作表的多条SQL语句修改表名普通方法:altertabletest1renametest;进阶方法:renametabletesttotest1;可同时修改多个:renam......
  • ESP8266 安信可固件 MQTT AT指令
    9.1AT+MQTTUSERCFG-SetMQTTUserConfigSetCommand:AT+MQTTUSERCFG=<LinkID>,<scheme>,<"client_id">,<"username">,<"password">,<cert_key_ID>,<CA_ID>,<"path">A......
  • Qt Debug模式无法运行
    问题:如题,在QtCreator中使用Debug模式启动程序,直接提示“程序异常结束。”,也不报任何错,然后Debug目录直接双击xxx.exe文件,提示缺少Qt5Cored.dll解决方法:从QT的bin目录下......
  • Qt 运行显示 This application failed to start because it could not find or load t
    QT发布exe文件以后,运行文件时提示:ThisapplicationfailedtostartbecauseitcouldnotfindorloadtheQtplatformplugin“windows”.Reinstallingtheapplicat......
  • Qt 解决报错 This application failed to start because it could not find or load t
    解决Qt5报错ThisapplicationfailedtostartbecauseitcouldnotfindorloadtheQtplatformpluginQT为了简化生成发布版本,特别提供了工具"windeplayqt.exe",这......
  • 上网记录20220816
    一个dotnet数据库orm框架 https://github.com/leadnt/FluentDAO一个基于HttpClient的开源项目。只需要定义c#接口并修改相关特性,即可异步调用远程http接口的客户......
  • 【2022杭电多校】第九场 1008 Shortest Path in GCD Graph 【容斥+优化】
    链接https://acm.hdu.edu.cn/showproblem.php?pid=7240题意是有n个点组成的完全图,每个点的权重组成了1-n的排列,点i和点j的距离为\(gcd(i,j)\),给出q组询问,每次询问给出u......
  • 2022-08-16面试
    1.springboot和tomcat2.springcloud的请求如何通过网关鉴权?3.springmvc启动时组件的加载顺序?4.mybatis如何同时更新三条记录5.hibernate实现级联更新6.一个web程序......
  • 部署Qt程序-Linux
    Qt程序编译出可执行文件之后,一般会依赖Qt的相关动态库,在没有安装过Qt的机器上就无法运行。所以在部署时需要将依赖的Qt相关库文件也打包进去。linuxdeployqt工具windeplo......
  • 2022-08-16 第六小组 高佳誉 学习笔记
    DQL数据库查询语言重点,DQL是我们每天都要接触编写最多也是最难的SQL,该语言用来查询记录,不会修改数据库和表结构。构建数据库创建一张student表:DROPTABLEIFEXISTSst......