一、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)
【注意】:
- QPainter的坐标是使用的窗口坐标(逻辑坐标);
- 当QPainter初始化时,视口和窗口坐标默认是相同的,也就是说原点(0,0)在于窗口左上角;
- 视口和窗口的最小坐标和最大坐标是从左上到右下的;
二、案例(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,以上便是本文的全部内容了,如果对你有所帮助,记得点个赞哟~