Qt二维图形引擎 -1

半神半圣亦半仙,全儒全道是全贤,脑中真书藏万卷,掌握文武半边天

(有看霹雳的同道吗)

介绍

最近工作有大量二维三维图形绘制的的需求,用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);

}

3QRadialGradient 辐射渐变

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类的基本面貌介绍到这里,上面介绍的常用绘图函数和渐变效果如下图,后面的博文再对个别函数和功能的使用做详细分析:





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章