半神半圣亦半仙,全儒全道是全贤,脑中真书藏万卷,掌握文武半边天
(有看霹雳的同道吗)
介绍
最近工作有大量二维三维图形绘制的的需求,用Qt也好多年了,趁着这个机会再讲Qt的图形绘制引擎做个系统的学习记录(记在脑子里的东一段时间不去碰他就总是看不真切他的样子了),这是这一系列博客的开篇章节,且让我抄抄书,说说QT二维图形引擎的概貌,原因怕是自己胡诌错了。
Qt的二维图形是基于QPainter类的。QPainter既可以绘制几何形状,如点、线、圆、弧形、饼状图、多边形、贝塞尔曲线等,也可以绘制像素映射、图像和文字。此外,Qpainter还支持一些高级特性,像反走样、像素混合、渐变填充和矢量路径等。QPainter也支持线性变换,例如平移、旋转、错切和缩放。QPainter可以在“绘图设备”上,例如QWidget、QPixmap、QImage或者QSvgGenerator。重新实现Qwidget::paintEvent可以用于定制窗口部件的外观,可以指定某一风格的表单或者创建创建一个QStyle的子类。可以使用OPenGL命令来代替QPainter。OpenGL是一个绘制三维图形的标准库,QT里面使用QtOpenGL模块简化了OpenGL代码与Qt应用程序之间的继承。本章后面章节介绍QPainter类绘图,进入Qt的二维图形引擎世界吧。
用QPainter绘图
在QT中使用QPainter绘图的一般方法是重写绘图设备(一般是窗口部件)的paintEvent类,在方法内创建QPainter对象调用绘图操作,就像下面这样:
void MyWidget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
... ...
}
使用QPainter的draw...()函数可以绘制各种各样的形状,绘制的效果取于QPainter的设置,一些值是从设备中取得的,一些值是初始化成默认值的。三个主要的设置是画笔(QPen)、画刷(QBrush)和字体(QFont),可以通过调用QPainter对象的SetPen()、setBrush()、setFont()来修改这些设置,下面介绍QPainter类介绍下draw...()函数能绘制的一些总要的基础图形。
1). drawPoint() 画点
void MyWidget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setPen(QPen(Qt::red,20));
painter.drawPoint(50,20);
}
2). drawLine() 画线
void MyWidget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setPen(QPen(Qt::red,2,Qt::SolidLine));
painter.drawLine(150,20,250,20);}
3). drawPolyline() 画折线
void MyWidget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setPen(QPen(Qt::red,2,Qt::SolidLine));
const QPointF points[3] = {QPointF(300, 30),
QPointF(350, 5),
QPointF(400, 30),
};
painter.drawPolyline(points,3);
}
4).drawPolygon() 画多边形
void MyWidget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setPen(QPen(Qt::red,2,Qt::SolidLine));const QPointF points[4] = {
QPointF(500, 5),
QPointF(450, 30),
QPointF(650, 30),
QPointF(600,5)
};
painter.drawPolygon(points,4);
}
5).drawRect 画矩形
void MyWidget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setPen(QPen(Qt::red,2,Qt::SolidLine));const QPointF points[4] = {
QPointF(500, 5),
QPointF(450, 30),
QPointF(650, 30),
QPointF(600,5)
};
painter.drawPolygon(points,4);
}
6).drawRoundRect 画圆角矩形
void MyWidget::paintEvent(QPaintEvent* event)
{
QPainter painter(this);
painter.setPen(QPen(Qt::red,2,Qt::SolidLine));
painter.setRenderHint(QPainter::Antialiasing,true);
painter.drawRoundRect(900,5,100,25);
}
7).drawEllipse 画椭圆
void MyWidget::paintEvent(QPaintEvent* event)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing,true);
painter.setPen(QPen(Qt::red,2,Qt::DashDotLine,Qt::RoundCap));
painter.setBrush(QBrush(Qt::green,Qt::SolidPattern));
painter.drawEllipse(1050,10,100,20);}
8).drawArc 画弧
void MyWidget::paintEvent(QPaintEvent* event)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing,true);
painter.setPen(QPen(Qt::red,2,Qt::SolidLine,Qt::RoundCap));
painter.setBrush(QBrush(Qt::green,Qt::SolidPattern));
painter.drawArc(10,150,100,80,16*30,16*120);
}
9).drawChord 画弦
void MyWidget::paintEvent(QPaintEvent* event)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing,true);
painter.setPen(QPen(Qt::red,2,Qt::SolidLine,Qt::RoundCap));
painter.setBrush(QBrush(Qt::green,Qt::SolidPattern));
painter.drawChord(150,150,100,80,16*30,16*120);
}
9).drawPie 画饼状图
void MyWidget::paintEvent(QPaintEvent* event)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing,true);
painter.setPen(QPen(Qt::red,2,Qt::SolidLine,Qt::RoundCap));
painter.setBrush(QBrush(Qt::green,Qt::SolidPattern));
painter.drawPie(300,130,100,80,16*30,16*120);
}
10).drawText 画文本
void MyWidget::paintEvent(QPaintEvent* event)
{
QPainter painter(this);
painter.setPen(QPen(Qt::red,2,Qt::SolidLine,Qt::RoundCap));
QFont font;
font.setPointSize(40);
painter.setFont(font);
painter.drawText(450,170,"AG");
}
10).drawPixmap 画像素图
void MyWidget::paintEvent(QPaintEvent* event)
{
QRectF target(550, 100,100,80);
QRectF source(0.0, 0.0, 150, 150);
QPixmap pixmap("1.png");
QPainter painter(this);
painter.drawPixmap(target, pixmap, source);}
11).drawPath 画路径
void MyWidget::paintEvent(QPaintEvent* event)
{
QPainterPath path;
path.moveTo(700, 150);
path.lineTo(700, 100);
path.lineTo(800,150);
path.lineTo(700,150);
QPainter painter(this);
painter.setPen(QPen(Qt::red,2,Qt::SolidLine,Qt::RoundCap));
painter.drawPath(path);}
常用的draw函数就上面介绍的11个,用上面的11个draw函数几乎可以绘制任何形状和图形。常用的绘图函数介绍完了,再介绍下Qt在绘图填充支持的3种渐变:线性渐变、锥形渐变和辐射渐变。
1)QLinearGradient 线性渐变
void MyWidget::paintEvent(QPaintEvent* event)
{
QLinearGradient gradient(10,300,110,340);
gradient.setColorAt(0.0,Qt::white);
gradient.setColorAt(0.5,Qt::green);
gradient.setColorAt(1.0,Qt::black);
QPainter painter(this);
painter.setBrush(gradient);
painter.drawRect(10,300,100,40);
}
2)QConicalGradient 锥形渐变
void MyWidget::paintEvent(QPaintEvent* event)
{
QConicalGradient gradient(250,320,30);
gradient.setColorAt(0.0,Qt::white);
gradient.setColorAt(0.5,Qt::green);
gradient.setColorAt(1.0,Qt::black);
QPainter painter(p);
painter.setBrush(gradient);
painter.drawRect(200,300,100,40);}
3)QRadialGradient 辐射渐变
void MyWidget::paintEvent(QPaintEvent* event)
{
QRadialGradient gradient(450,320,20);
gradient.setColorAt(0.0,Qt::white);
gradient.setColorAt(0.5,Qt::green);
gradient.setColorAt(1.0,Qt::black);
QPainter painter(p);
painter.setBrush(gradient);
painter.drawRect(400,300,100,40);}
QPainter类的基本面貌介绍到这里,上面介绍的常用绘图函数和渐变效果如下图,后面的博文再对个别函数和功能的使用做详细分析: