Qt 的绘图功能非常强大,它可以绘制一切想要的图形,从最简单的一条直线到其他任何复杂的图形,还可以用来绘制文本和图片。
Qt的绘图系统中由QPainter来完成具体的绘制操作。该类提供了大量高度优化的函数来完成GUI编程所需要的大部分绘制工作。
2D 绘图有两个思路:
1、不使用Qt的视图框架。
在一个部件重绘事件paintEvent()中绘制,首先创建QPainter对象,再进行图形的绘制,最后程序结束自动销毁QPaint对象。
例如:
void SimpleExampleWidget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setPen(Qt::blue);
painter.setFont(QFont("Arial", 30));
painter.drawText(rect(), Qt::AlignCenter, "Qt");
}
**
2.1 直接添加
例如:在场景中直接添加一个多边形。
QPolygonF myPolygon;
myPolygon <<QPointF(-8, 8)<<QPointF(8, 8)<<QPointF(0,-8);
//这里的_scene 是QGraphicsScene *_scene的对象。
QAbstractGraphicsShapeItem *tag_pt = _scene->addPolygon(myPolygon);
2.2 间接添加
图形项可以通过鼠标绘制,可以预先绘制好,但是绘制部分还是需要QPainter来实现。
例如:创建一个一个图形项,继承QGraphicsItem
class AncItem: public QGraphicsItem
{
public:
AncItem();
QRectF boundingRect() const;
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
QWidget *widget);
void setColor(const QColor &color) {
brushColor = color; }
void setAncColor(bool active);
protected:
// void keyPressEvent(QKeyEvent *event);
void mousePressEvent(QGraphicsSceneMouseEvent *event);
// void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
// void contextMenuEvent(QGraphicsSceneContextMenuEvent *event);
private:
QColor brushColor;
};
然后在Paint()函数中绘制图形
void AncItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
QWidget *widget)
{
// 设置画笔颜色、宽度
painter->setPen(QPen(QColor(255,255,0),2));
painter->setBrush(brushColor);
/*-------绘制三角形---------*/
static const QPointF points[3] = {
QPointF(-8, -8), QPointF(8, -8), QPointF(0,12)};
painter->drawPolygon(points, 3);
/*---------------绘制三条弧线-------------*/
// 反走样
painter->setRenderHint(QPainter::Antialiasing, true);
// 设置画笔颜色、宽度
painter->setPen(QPen(QColor(255, 0, 230), 2));
QRectF rect(-15, -15, 30, 30);
// 起始角度
int startAngle = -60 * 16;
// 跨越度数
int spanAngle = -65 * 16;
// 绘制弧线
painter->drawArc(rect, startAngle, spanAngle);
rect.setRect(-20, -20, 40, 40);
// 起始角度
startAngle = -60 * 16;
// 跨越度数
spanAngle = -65 * 16;
// 绘制弧线
painter->drawArc(rect, startAngle, spanAngle);
rect.setRect(-25, -25, 50, 50);
// 起始角度
startAngle = -60 * 16;
// 跨越度数
spanAngle = -65 * 16;
// 绘制弧线
painter->drawArc(rect, startAngle, spanAngle);
}
2D绘图会涉及到这样几个方面的内容:
1、基本图形绘制和填充。
2、图形的位置关系,坐标系统如何建立的?
3、文字和路径可以绘制吗?
4、图像如Pixmap,Image 等是如何处理?
5、图像的滤镜等算法如何处理?
6、重绘事件如何处理,如何展现动画?
这些内容都在QPainter类中可以可以实现,绘制的过程,一般也都是先设置(Settings),设置笔刷,设置画笔等,然后操作(Drawing), Qt 官方提供了一个示例 Basic Drawing example。可以很好地借鉴。