Qt实战案例(22)——利用QPainter实现图形绘制实例

一、QPainter中视口和窗口介绍

1.1 视口Viewport

视口是基于QPaintDevice类组件的坐标实现的,属于物理坐标,通过setViewport成员函数设置:

void QPainter::setViewport(const QRect &rectangle)
void QPainter::setViewport(int x, int y, int width, int height)

1.2 窗口Window

窗口是基于自身的逻辑坐标实现的,并不是真实坐标,可以通过setWindow成员函数设置
void QPainter::setWindow(const QRect &rectangle)
void QPainter::setWindow(int x, int y, int width, int height)

【注意】:

  1. QPainter的坐标是使用的窗口坐标(逻辑坐标);
  2. 当QPainter初始化时,视口和窗口坐标默认是相同的,也就是说原点(0,0)在于窗口左上角;
  3. 视口和窗口的最小坐标和最大坐标是从左上到右下的;

二、案例(1)——绘制田字格

核心代码:

void MainWindow::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    QSize ViewWH(100,100);        //定义视口宽高
    painter.setViewport(50,50,ViewWH.width(),ViewWH.height());
    painter.setWindow(-50,50,ViewWH.width(),-ViewWH.height());
    painter.setBrush(QColor(187,229,253));//设置画刷颜色——浅蓝色填充
    painter.setPen(QPen(QColor(11,67,127),2));//设置画笔颜色——深蓝色边框
    painter.drawRect(-50,50,ViewWH.width(),-ViewWH.height()); //窗口背景
    painter.drawLine(-50,0,50,0);       //画X坐标
    painter.drawLine(0,-50,0,50);       //画Y坐标
}

运行结果:
在这里插入图片描述

三、案例(2)——绘制正弦波

核心代码:

void MainWindow::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setViewport(50,50,width()-100,height()-100);    //设置视口为中心处
    painter.setWindow(-10,4,20,-8);    //定义窗口 左上角为(-10,4) 右下角为(10,-4)
    painter.fillRect(-10,4,20,-8,Qt::black); //设置背景为黑色
    //由于当前窗口和视口的比例为 width()-100 : 20,所以1px的横纵Line线宽 = 1/(width()-100)/20
    painter.setPen(QPen(QBrush(Qt::green),1/(width()-100)/20));
    painter.drawLine(-10,0,10,0);//绘制X横轴
    painter.setPen(QPen(QBrush(Qt::green),1/(height()-100)/8));
    painter.drawLine(0,-4,0,4);//绘制Y纵轴
    for(float x=-10;x<10;x+=0.01)
    {
            float y= qSin(x);
            painter.drawPoint(QPointF(x,y));
            qDebug()<<x <<","<<y;
    }
}

运行结果:
在这里插入图片描述

四、案例(3)——绘制文本

核心代码:

void MainWindow::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    QFont font;
    font.setPixelSize(24); //设置字体像素大小为12
    QString text="1234567"; //设置显示的文本
    QFontMetrics metrics(font);
    int w=metrics.width(text); //获取显示文本的宽度【Qt6中不再支持】
    int h=metrics.height(); //获取显示文本的高度
    painter.setFont(font);
    painter.setPen(Qt::blue);
    painter.drawText(QRect(width()/2-w,height()/2-h,w,h),text);
    painter.drawRect(QRect(width()/2-w,height()/2-h,w,h));
    qDebug()<<"w:"<<w; //一个字符大小为12*24,所以宽度为12*7
    qDebug()<<"h:"<<h; //高度为24
}

运行结果:
在这里插入图片描述


ok,以上便是本文的全部内容了,如果对你有所帮助,记得点个赞哟~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wendy_ya

您的鼓励将是我创作的最大动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值