二维图形

Qt的二维图形引擎是基于QPainter类的,QPainter既可以绘制几何图形(点、线、矩形、弧形、饼状图、多边形、贝塞尔弧线等),也可以绘制像素映射、图像和文字。此外,QPainter也支持一些高级特性,例如反走样(针对文字和图形边缘)、像素混合、渐变填充和矢量路径等,QPainter也支持线性变换,例如平移、旋转、错切和缩放。

QPainter可以画在"绘图设备"上,例如:QWidget、QPixmap、QIamge或者QSvgGenerator。QPainter也可以与QPrinter一起使用来打印文件盒创建PDF文档。这意味着通常可以用相同的代码在屏幕上显示数据,也可以生成打印形式的报告。

用QPainter绘图

如果要在绘图设备(一般为窗口部件)上绘图,只需创建一个QPainter,再将指针传到该设备中。

void MyWidget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
}

使用QPainter的绘制点drawPoint()、绘制直线drawLine()、绘制折线drawPolyLine()、绘制多点drawPoints()、绘制多直线drawLines()、绘制矩形区域drawRect()、绘制圆角区域drawRoundRect()、绘制椭圆drawEllipse()、绘制背景图片drawPixmap()等函数,可以绘制各种各样的形状。
在这里插入图片描述
绘制效果取决于QPainter的设置,一些是从设备中取得的,然而有些被初始化成默认值。三个主要设置是画笔、画刷、字体:
1)画笔:用来画线和边缘。它包含颜色、宽度、线性、拐点风格以及连线风格。
2)画刷用来填充几何形状的图案。它一般由颜色和风格组成,但同时也可以是纹理或者是一个渐变。
3)字体用来绘制文字。

可以随时调用QPen、QBrush或者QFont对象的setPen()、setBrush()和setFont()来修改这些设置。
在这里插入图片描述
拐点:FlatCap(平的),SquareCap(方的),RoundCap(圆的),MiterJoin(斜接尖角),BevelJoin(斜接平角),RoundJoin(斜接圆角)
在这里插入图片描述
连线方式:SolidLine(直线),DashLine(虚线),DotLine(点线),DashDotLine(虚点线) ,DashDotDotLine(虚点点线),NoPen(没有线)
在这里插入图片描述

MainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    void paintEvent(QPaintEvent *event);

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

MainWindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPainter>
#include <QRect>
#include <QBrush>
#include <QFont>
#include <QPointF>
//用到什么类就包含什么头文件

//这个MainWindow类是系统自动为我起的名字,实际操作中可自定义
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

//核心代码
void MainWindow::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);             // 创建QPainter一个对象

    // 画一条直线
    QPen pen;
    pen.setColor(Qt::yellow);           // 设置画笔为黄色
    painter.setPen(pen);                // 设置画笔
    painter.drawLine(rect().topLeft(), rect().bottomRight());

    // 画一个空心矩形
    pen.setColor(Qt::darkRed);
    painter.setPen(pen);
    painter.drawRect(QRect(1, 1, 100, 100));

    // 画一个实心矩形
    QBrush bruch(Qt::FDiagPattern);     // 画刷
    painter.setBrush(bruch);            // 设置画刷
    painter.drawRect(QRect(105, 1, 100, 100));

    // 画一个多点线
    pen.setColor(Qt::white);
    painter.setPen(pen);
    bruch.setStyle(Qt::NoBrush);        // 将画刷设置成null
    painter.setBrush(bruch);
    static const QPointF points[4] = {QPointF(210.0, 1), QPointF(220.0, 50.3), QPointF(300, 100.4), QPointF(260.4, 120.0)};
    painter.drawPolyline(points, 4);

    // 画多个点
    QPointF pointf[10];
    for (int i=0; i<10; ++i)
    {
        pointf[i].setX(2.0+i*10.0);
        pointf[i].setY(130.0);
    }
    painter.drawPoints(pointf, 10);

    // 画多条线
    QLineF linef[5];
    for (int j=0; j<5; ++j)
    {
        linef[j].setP1(QPointF(110.9+j*10, 120.0));
        linef[j].setP2(QPointF(120.8+j*12, 200.0));
    }
    painter.drawLines(linef, 5);

    // 画一个多边形
    QPolygonF polygon;
    polygon << QPointF(200.0, 120.0) << QPointF(230.0, 130.0) << QPointF(260.0, 180.0) << QPointF(200.0, 200.0);
    bruch.setStyle(Qt::CrossPattern);
    painter.setBrush(bruch);
    painter.drawPolygon(polygon, Qt::WindingFill);

    // 画一个圆角矩形
    QRectF rectangle(290.0, 110.0, 50, 50);
    bruch.setStyle(Qt::SolidPattern);
    painter.setBrush(bruch);
    painter.drawRoundedRect(rectangle, 20.0, 15.0);

    // 画一个QString
    painter.drawText(50, 300, "Hello DevDiv!");

    //如果挡住了上面的图形的话就把他们两个注释掉吧

    //画一个椭圆
    painter.setRenderHint(QPainter::Antialiasing, true);//启用反走样,告诉QPainter用不同颜色强度绘制边框以减少视觉扭曲,这种扭曲一般
    //会在边框转换为像素的时候发生。由此生成的结果是的到一条平滑的曲线
    painter.setPen(QPen(Qt::black, 12, Qt::DashDotDotLine, Qt::RoundCap)); //设置画笔黑色,12像素,实线,圆拐角
    painter.setBrush(QBrush(Qt::green, Qt::SolidPattern)); //设置画刷绿色无缝填充
    painter.drawEllipse(80, 80, 400, 240); //绘制椭圆


    //绘制三次贝塞尔曲线
    painter.setRenderHint(QPainter::Antialiasing, true); //设置抗锯齿,得到较为平滑的边缘
    QPainterPath path; //QPainterPath类确定绘制图形的路径
    path.moveTo(80, 320); //起点位置
    path.cubicTo(200, 80, 320, 80, 480, 320); //路径依次经过点
    painter.setPen(QPen(Qt::black, 8)); //设置画笔黑色,12像素
    painter.drawPath(path); //绘制路径

    //绘制一个从60度-270度的饼状图
    painter.setRenderHint(QPainter::Antialiasing, true); //设置抗锯齿,得到较为平滑的边缘
    painter.setPen(QPen(Qt::black, 15, Qt::SolidLine, Qt::RoundCap, Qt::MiterJoin)); //设置画笔黑色,12像素,实线,圆拐角
    painter.setBrush(QBrush(Qt::blue, Qt::DiagCrossPattern)); //设置画刷蓝色纹理填充
    painter.drawPie(80, 80, 400, 240, 60*16, 270*16); //最后两个参数以1/161度为单位

    //画圆
    painter.setRenderHint(QPainter::Antialiasing,true);//设置抗锯齿,得到较为平滑的边缘
    painter.setPen(QPen(Qt::black,12,Qt::SolidLine,Qt::RoundCap));//设置画笔黑色,12像素,实线,圆拐角
    painter.setBrush(QBrush(Qt::green,Qt::SolidPattern));//设置画刷绿色无缝填充
    painter.drawEllipse(80,80,200,200);//绘制圆 长宽相等 绘制正圆
}

main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

在这里插入图片描述
调用setRenderHint()可以启用反走样,它会告诉 QPainter 用不同的颜色强度绘制边框以减少视觉扭曲,这种扭曲一般会在边框转换为像素的时候发生。由此生成的结果是可以在支持这一特性的平台和设备上得到平滑的边缘。

QPainterPath类可以通过连接基本的图形元素来确定任意的矢量形状:直线、椭圆、多边形、弧形、贝塞尔曲线和其他的绘制路径。绘制路径是基本的图元,从这个意义上来说,任何图形或图形组合都可以用绘制路径描述。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐