前面大多学的是控件用户界面的安排学习,现在是Qt一个极其重要的方面,就是在绘制二维图形方面的强大功能,在使用得当情况下绝大部分你需要的界面和图形都能非常好看,也有很多自带的的和第三方图形库能够使用,会比手动绘制方便的多,就看你用的溜不溜了。
Qt的二维图形引擎是基于QPainter类的。QPainter既可以绘制几何形状也可以绘制像素文字等元素。还支持一些高级特性,反走样、像素混合、渐变填充、矢量路径之类的,还有线性变换、平移旋转什么的,可谓老牛逼了。
重新实现QWidget::painterEvent()可以用于定制窗口部件,并且相当随便的控制外观。Qt也有QGraphicsView、QGraphicsScene和QGraphicsItem类引用全新的“图形视图”体系。可以供交互、绘制、操作。QpenGL是一个绘制三维图形的标准库,也很厉害,以后详述。
一、使用QPainter绘图
要想在绘图设备上(一般指的是窗口部件)上绘图,只需要创建一个QPainter,再将指针传到该设备中。
例如:
void MyWidget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
}
QPainter的drawXXX()函数可以绘制各种形状,当然前提是设置好工具的属性。
查看Qt助手对这些绘图的理解帮助会非常大。
QPainter可以这样用:
void Widget:: draw()
{
QPainter painter( this );
painter. setPen( QPen ( Qt :: black, 10 , Qt :: DashDotLine, Qt :: RoundCap));
painter. setBrush( QBrush ( Qt :: green, Qt :: SolidPattern));
painter. drawEllipse( 10 , 10 , 400 , 240 );
painter. drawRect( QRect ( 10 , 300 , 400 , 140 ));
}
可以这样用嘞:
void Widget:: drawBezier()
{
QPainter painter( this );
painter. setRenderHint( QPainter :: Antialiasing, true );
QPainterPath path;
path. moveTo( 10 , 320 );
path. cubicTo( 200 , 80 , 400 , 80 , 480 , 320 );
painter. setPen( QPen ( Qt :: black, 2 ));
painter. drawPath( path);
painter. setPen( QPen ( Qt :: red, 4 ));
painter. drawPoint( 10 , 320 );
painter. drawPoint( 200 , 80 );
painter. drawPoint( 400 , 80 );
painter. drawPoint( 480 , 320 );
}
下面做一个QPainter的实例,一个改变绘图的控制器,当然是不完善的。
#include "painterarea.h"
#ifndef PAINTAREA_H
#define PAINTAREA_H
#include <QWidget>
#include <QPen>
#include <QPaintEvent>
class PaintArea : public QWidget
{
Q_OBJECT
public:
enum Shape
{
Line, Rectangle, RoundRect, Ellipse, Polygon, Polyline, Points, Arc, Path, Text,
Pixmap
};
PaintArea(QWidget * parent = 0);
void setShape(Shape); //设置形状
void setPen(QPen); //设置画笔
void setBrush(QBrush); //设置画刷
void setFillRule(Qt::FillRule);//设置填充模式
void paintEvent(QPaintEvent *);//重画事件
private:
Shape shape;
QPen pen;
QBrush brush;
Qt::FillRule fillRule;
};
#endif // PAINTAREA_H
painterarea.cpp
#include "painterarea.h"
#include <QPainter>
PaintArea::PaintArea(QWidget *parent)
:QWidget(parent)
{
setPalette(QPalette(Qt::white)); //设置背景颜色
setAutoFillBackground(true);//设置自动填充背景色
setMinimumSize(400, 400);//设置窗口最下大小
}
void PaintArea::setShape(Shape s) //update()更新窗口部件
{
shape = s;
update();
}
void PaintArea::setPen(QPen p)
{
pen = p;
update();
}
void PaintArea::setBrush(QBrush b)
{
brush = b;
update();
}
void PaintArea::setFillRule(Qt::FillRule rule)
{
fillRule = rule;
update();
}
//重画事件
void PaintArea::paintEvent(QPaintEvent *)
{
QPainter p(this);
p.setPen(pen);
p.setBrush(brush);
QRect rect(100, 100, 250, 200);//构造一个矩形
static const QPoint points[4] =
{
QPoint(100,100),
QPoint(200,150),
QPoint(300,250),
QPoint(150,300)
};//确定Points的四个点的坐标
int startAngle = 60 * 16;
int spanAngle = 180 * 16; //为绘制曲线设置参数变量
QPainterPath path; //QPainterPath为Qpainter类提供了一个存储容器,里面包含了画的内容和画的顺序