介绍
QPainter类的成员角色有:
具体参考: https://blog.csdn.net/cloud_castle/article/details/26256663
QPainter基础图形绘制相关函数:
绘画圆弧drawArc
QPainter painter(this);
painter.setPen( QPen(QColor(11,67,127),3));
QRectF rect(40.0, 40.0, 100.0, 100.0);
painter.setRenderHint(QPainter:: Antialiasing, true); //设置渲染,启动反锯齿
painter.drawArc(rect,30*16,150*16); //绘画角度为30°~(30+150°)
painter.drawPoint(40+50,40+50); //绘制中心点
绘画椭圆drawElipse
QPainter painter(this);
painter.setRenderHint(QPainter:: Antialiasing, true); //设置渲染,启动反锯齿
painter.setPen( QPen(QColor(11,67,127),3));
painter.drawEllipse(40.0, 40.0, 100.0, 100.0); //半径为50的圆
绘画扇形drawPie
QPainter painter(this);
painter.setPen(QPen(QColor(11,67,127),3));
QRectF rect(40.0, 40.0, 100.0, 100.0);
painter.setRenderHint(QPainter:: Antialiasing, true); //设置渲染,启动反锯齿
painter.drawPie(rect,30*16,150*16); //绘画角度为30°~(30+150°)
绘画弦drawChord
QPainter painter(this);
painter.setPen(QPen(QColor(11,67,127),3));
QRectF rect(40.0, 40.0, 100.0, 100.0);
painter.setRenderHint(QPainter:: Antialiasing, true); //设置渲染,启动反锯齿
painter.drawChord(rect,30*16,150*16); //绘画角度为30°~(30+150°)
QPainter-视口/窗口
在Qt中, QPainter可以通过视口和窗口来设置自身组件大小位置.
视口: 基于QPaintDevice类组件的坐标实现的,属于物理坐标,通过setViewport成员函数设置
窗口: 基于自身的逻辑坐标实现的,并不是真实坐标,可以通过setWindow成员函数设置
需要注意的是:
示例1-设置原点(0,0)为窗口的(100,100),设置绘画区域为窗口大小为100*100
如下图所示,其中蓝色为视口坐标,红色为窗口坐标:
由于数学Y坐标方向与屏幕Y坐标方向是相反的,所以w保持不变,h = -height
所以对应代码为:
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-在窗口的中心处绘制正弦波
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);
painter.setPen(QPen(QBrush(Qt::green),1/(width()-100)/20));
//由于当前窗口和视口的比例为 width()-100 : 20
//所以1px的横纵Line线宽 = 1/(width()-100)/20
painter.drawLine(-10,0,10,0);
painter.setPen(QPen(QBrush(Qt::green),1/(height()-100)/8));
painter.drawLine(0,-4,0,4);
for(float x=-10;x<10;x+=0.01)
{
float y= qSin(x);
painter.drawPoint(QPointF(x,y));
qDebug()<<x <<","<<y;
}
效果如下: