精华内容
下载资源
问答
  • 下面小编就为大家带来一篇PyQt5利用QPainter绘制各种图形的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • PyQt5中QPainter类QBrush画刷使用大全实例源码:使用画刷QBrush绘制30张效果图
  • 本资源主要用QPainter类绘制直线、矩形、图片基本用法,可以用于自定义QWidget和重新绘制QWidget边框,也就是用这个代码类,可以自定义自己的边框和任意背景形状。原理讲解博客地址:...
  • QPainter

    2020-12-29 18:54:00
    Qt 中提供了强大的 2D 绘图系统,可以使用相同的 API 在屏幕和绘图设备上进行绘制,它主要基于QPainter、QPaintDevice 和 QPaintEngine 这三个类: QPainter 用于执行绘图操作,其提供的 API 在 GUI 或 QImage、...

    概念

    Qt 中提供了强大的 2D 绘图系统,可以使用相同的 API 在屏幕和绘图设备上进行绘制,它主要基于QPainter、QPaintDevice 和 QPaintEngine 这三个类:

    1. QPainter 用于执行绘图操作,其提供的 API 在 GUI 或 QImage、QOpenGLPaintDevice、QWidget 和QPaintDevice 显示图形(线、形状、渐变等)、文本和图像。
    2. QPaintDevice 不直接绘制物理显示画面,而利用逻辑界面的中间媒介。例如,绘制矩形图形时,为了将对象绘制到 QWidget、QGLPixelBuffer、QImage、QPixmap、QPicture 等多种界面中间,必须使用 QPaintDevice。
    3. QPaintEngine 提供了一些接口,可用于 QPainter 在不同的设备上进行绘制。

    绘图系统由 QPainter 完成具体的绘制操作,QPainter 类提供了大量高度优化的函数来完成 GUI 编程所需要的大部分绘制工作。它可以绘制一切想要的图形,从最简单的一条直线到其他任何复杂的图形,例如:点、线、矩形、弧形、饼状图、多边形、贝塞尔弧线等。此外,QPainter 也支持一些高级特性,例如反走样(针对文字和图形边缘)、像素混合、渐变填充和矢量路径等,QPainter 也支持线性变换,例如平移、旋转、缩放。

    QPainter 一般在部件的绘图事件 paintEvent() 中进行绘制,首先创建 QPainter 对象,然后进行图形的绘制,最后记得销毁 QPainter 对象。当窗口程序需要升级或者重新绘制时,调用此成员函数即使用 repaint()和 update() 后,调用函数 paintEvent()。

    paintEvent事件会在什么情况下被调用

    1. 在窗口部件第一次显示时,系统会自动产生一个绘图事件,从而强制绘制这个窗口部件;
    2. 当重新调整窗口部件的大小时,系统也会产生一个绘制事件;
    3. 当窗口部件被其他窗口部件遮挡,然后又再次显示出来的时候,就会对那些隐藏的区域产生一个绘制事件;
    4. 同时也可以调用QWidget::update()或者QWidget::repaint()来强制产生一个绘制事件。二者的区别是:
      1)repaint()函数会强制产生一个即时的重绘事件,而update()函数只是在Qt下一次处理事件时才调用一次绘制事件;
      2)如果多次调用update(),Qt会把连续多次的绘制事件压缩成一个单一的绘制事件,这样可避免闪烁现象。

    用法

    QPainter对象

    QPainter painter;
    

    设置字体-setFont()

    void setFont(const QFont &font);
    QFont font;
    font.setFamily("Consolas"); //款式
    font.setBold(true); //黑体
    font.setPixelSize(40 * ratioH); //大小
    painter.setFont(font);
    

    设置画笔-setPen()

    void setPen(const QPen &pen);
    void setPen(const QColor &color);
    painter.setPen(QColor(0,160,230));
    void setPen(Qt::PenStyle style);
    painter.setPen(Qt::NoPen); //置画笔为空笔 目的是使绘制的图形没有描边
    

    设置画刷-setBrush()

    QBrush brush(QColor::fromRgb(141, 121, 81));
    painter.setBrush(brush);
    

    画圆角矩形

    //QRectF构造一个(x,y)为左上角的坐标,给出宽度,高度的矩形
    void drawRoundedRect ( const QRectF & rect, qreal xRadius, qreal yRadius, Qt::SizeMode mode = Qt::AbsoluteSize )
    //xRadius,yRadius为椭圆的半径
    painter.drawRoundedRect(QRectF(2 * ratioW, 2 * ratioH, width() - 4 * ratioW, height() - 4 * ratioH), rX, rY);
    

    绘制文本
    设置文本两种方式:

    1. 在指定位置绘制文本,不会自动换行
    void QPainter::drawText(int x, int y, const QString &text)
    void QPainter::drawText(const QPoint &position, const QString &text)
    
    1. 在指定的矩形内绘制文本,设置 flags 能够实现自动换行,对齐等
    void QPainter::drawText(const QRect &rectangle, int flags, const QString &text, QRect *boundingRect = 0)
    

    flags 为下面的值之一或则为对其取或的结果:

    Qt::AlignLeft //左对齐
    Qt::AlignRight //右对齐
    Qt::AlignHCenter //水平居中
    Qt::AlignJustify //两端对齐
    Qt::AlignTop //顶部对齐
    Qt::AlignBottom //底部对齐
    Qt::AlignVCenter //垂直居中
    Qt::AlignCenter //居中
    
    void MainWindow::paintEvent(QPaintEvent *event)
    {
        Q_UNUSED(event);
    
        QPainter painter(this);
        // 设置画笔颜色
        painter.setPen(QColor(0, 160, 230));
    
        // 设置字体:微软雅黑、点大小50、斜体
        QFont font;
        font.setFamily("Microsoft YaHei");
        font.setPointSize(50);
        font.setItalic(true);
        painter.setFont(font);
    
        // 绘制文本
        painter.drawText(rect(), Qt::AlignCenter, "Qt");
    }
    

    在这里插入图片描述
    首先为该部件创建了一个 QPainter 对象,用于后面的绘制。
    使用 setPen() 来设置画笔的颜色(淡蓝色)。
    通过使用 QFont 来构建我们想要的字体,setFamily()设置字体为微软雅黑、setPointSize() 设置点大小30、setItalic() 设置斜体, 然后通过 setFont() 来设置字体
    最后调用 drawText() 来实现文本的绘制,这里的 rect() 是指当前窗体的显示区域,Qt::AlignCenter 指文本居中绘制。

    绘制直线

    void MainWindow::paintEvent(QPaintEvent *event)
    {
        Q_UNUSED(event);
    
        QPainter painter(this);
        // 反走样
        painter.setRenderHint(QPainter::Antialiasing, true);
        // 设置画笔颜色
        painter.setPen(QColor(0, 160, 230));
        // 绘制直线
        painter.drawLine(QPointF(0, height()), QPointF(width() / 2, height() / 2));
    }
    

    在这里插入图片描述
    首先我们通过 setRenderHint() 来设置反走样,要么绘制出来的线条会出现锯齿,调用 setPen() 来设置画笔颜色(淡蓝色)。
    最后调用 drawLine() 来实现直线的绘制,其中 QPointF(0, height()) 是指直线的起点坐标、QPointF(width() / 2, height() / 2) 是指直线的终点坐标。

    绘制矩形

    void MainWindow::paintEvent(QPaintEvent *event)
    {
        Q_UNUSED(event);
    
        QPainter painter(this);
    
        // 反走样
        painter.setRenderHint(QPainter::Antialiasing, true);
        // 设置画笔颜色、宽度
        painter.setPen(QPen(QColor(0, 160, 230), 2));
        // 设置画刷颜色
        painter.setBrush(QColor(255, 160, 90));
        painter.drawRect(50, 50, 160, 100);
    }
    

    在这里插入图片描述
    首先我们使用 setPen() 来设置画笔颜色(淡蓝色)、宽度(2 像素),用来设置矩形区域的边框。然后使用setBrush() 来设置画刷颜色(橙色),用来填充矩形区域,最后调用 drawRect() 来实现矩形的绘制,其中参数依次顺序为 x、y、w、h,是指区域从 x 为 50,y 为 50 的坐标点起,宽度为 160,高度为 100 的矩形。

    绘制弧形

    void MainWindow::paintEvent(QPaintEvent *event)
    {
        Q_UNUSED(event);
    
        // 矩形
        QRectF rect(90.0, 90.0, 80.0, 90.0);
        // 起始角度
        int startAngle = 30 * 16;
        // 跨越度数
        int spanAngle = 120 * 16;
    
        QPainter painter(this);
    
        // 反走样
        painter.setRenderHint(QPainter::Antialiasing, true);
    
        // 设置画笔颜色、宽度
        painter.setPen(QPen(QColor(0, 160, 230), 2));
    
        // 绘制弧线
        painter.drawArc(rect, startAngle, spanAngle);
    }
    

    在这里插入图片描述
    画弧线时,角度被分成了十六分之一,就是说,如果要 30 度,就需是 30*16。它有起始角度和跨度,还有位置矩形,所以,要想画出自己想要的弧线,就需要大概估算出各个参数的预估值。

    绘制椭圆

    void MainWindow::paintEvent(QPaintEvent *event)
    {
        Q_UNUSED(event);
    
        QPainter painter(this);
    
        // 反走样
        painter.setRenderHint(QPainter::Antialiasing, true);
    
        // 设置画笔颜色、宽度
        painter.setPen(QPen(QColor(0, 160, 230), 2));
    
        // 绘制椭圆
        painter.drawEllipse(QPointF(120, 60), 50, 20);
    
        // 设置画刷颜色
        painter.setBrush(QColor(255, 160, 90));
    
        // 绘制圆
        painter.drawEllipse(QPointF(120, 140), 40, 40);
    }
    

    在这里插入图片描述
    这里我们绘制了一个椭圆和一个圆形,都是调用 drawEllipse() 接口,我们可以很轻易的发现,如果为椭圆的时候,后面两个参数不一样,圆形则相同。首先我们来看第一个参数 QPointF 是指椭圆的中心点相对当前窗体 QPoint(0, 0) 点的位置,后面的参数指椭圆的 x 轴及 y 轴的半径。

    绘制多边形

    void MainWindow::paintEvent(QPaintEvent *event)
    {
        Q_UNUSED(event);
    
        QPainter painter(this);
    
        // 反走样
        painter.setRenderHint(QPainter::Antialiasing, true);
    
        // 设置画笔颜色
        painter.setPen(QColor(0, 160, 230));
    
        // 各个点的坐标
        static const QPointF points[4] = {QPointF(30, 40), QPointF(60, 150), QPointF(150, 160), QPointF(220, 100)};
    
        // 绘制多边形
        painter.drawPolygon(points, 4);
    }
    

    在这里插入图片描述
    首先,我们定义一个个坐标点的位置,这里有四个点,分别为:QPointF(30, 40)、QPointF(60, 150)、QPointF(150, 160)、 QPointF(220, 100),然后调用 drawPolygon() 将各个点连接起来,绘制为多边形。

    绘制图片

    void MainWindow::paintEvent(QPaintEvent *event)
    {
        Q_UNUSED(event);
    
        QPainter painter(this);
    
        // 反走样
        painter.setRenderHint(QPainter::Antialiasing, true);
    
        // 绘制图标
        painter.drawPixmap(rect(), QPixmap(":/Images/logo"));
    }
    

    在这里插入图片描述
    通过 drawPixmap() 来绘制图片,我们可以指定图片绘制的区域 QRect,这里为整个界面的区域,当界面伸缩的时候,图片也会跟着伸缩。

    反走样
    抗锯齿绘图:又称反走样,对图像的边缘进行平滑处理,使其看起来更加柔和流畅的一种技术.
    QPainter进行绘制时可以使用setRenderHint 渲染提示来指定是否要使用抗锯齿功能。

    QPainter::Antialiasing:指示绘图引擎在可能的情况下应该进行边缘的抗锯齿
    QPainter::TextAntialiasing:绘制的字体抗锯齿

    QT 只是和很多系统的绘图API一样,提供了抗锯齿的方法,不过抗锯齿的属性默认都是关闭的,为了直观的理解抗锯齿(反走样)的作用。我们先给出效果图:
    在这里插入图片描述

    void setRenderHint ( RenderHint hint, bool on = true )
    painter.setRenderHint(QPainter::Antialiasing); //抗锯齿
    

    开启抗锯齿(反走样)功能。
    这里设置Antialiasing属性为true,经过这句设置,我们就打开了反走样功能。QPainter和OPengl一样,是一个状态机。因此,我们这里打开了她,之后所有的代码都是开启反走样绘制的了。

    painter.setRenderHint(QPainter::Antialiasing, true);
    

    关闭反走样功能
    到了这里,我们就会发现,反走样的效果要比走样的好得多。那么为什么系统绘图的API(包含QT在内)为什么默认不打开反走样的呢?这是因为,反走样是一种比较复杂的算法,在一些对图像质量要求不高的应用中,是不需要进行开启反走样的。为了提高效率,一般的图形绘制,都是默认不开启反走样的。

    painter.setRenderHint(QPainter::Antialiasing, false);
    

    示例:
    manwindow.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>
    //用到什么类就包含什么头文件
     
    //这个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!");
     
        //ps:下面这两个有点绿啊。。。。。。如果挡住了上面的图形的话就把他们两个注释掉吧
        //画一个椭圆
        painter.setRenderHint(QPainter::Antialiasing, true);//启用反走样,告诉QPainter用不同颜色强度绘制边框以减少视觉扭曲,这种扭曲一般
        //会在边框转换为像素的时候发生。由此生成的结果是的到一条平滑的曲线
        painter.setPen(QPen(Qt::black, 12, Qt::DashDotDotLine, Qt::RoundCap));
        painter.setBrush(QBrush(Qt::green, Qt::SolidPattern));
        painter.drawEllipse(80, 80, 400, 240);
     
        //绘制三次贝塞尔曲线
        painter.setRenderHint(QPainter::Antialiasing, true);
        QPainterPath path;
        path.moveTo(80, 320);
        path.cubicTo(200, 80, 320, 80, 480, 320);
        painter.setPen(QPen(Qt::black, 8));
        painter.drawPath(path);
    }
    

    main.cpp

    #include "mainwindow.h"
    #include <QApplication>
     
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w;
        w.show();
     
        return a.exec();
    }
    

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

    路径可以确定一个边缘,由边缘锁定的区域可以用画刷来填充。在现代应用中,渐变填充已成为单色填充的流行替代品。渐变填充利用颜色插值使得两个或更多颜色之间平滑过渡。他们常被用来创建三维效果,Plastique和Ckeanlooks风格就是使用渐变来渲染QPushButton的。

    QT支持三种类型的渐变:线性渐变、锥形渐变和辐射渐变,下面是例子:

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <QPainter>
    #include <QPen>
    #include <QBrush>
    #include <QFont>
     
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    }
     
    MainWindow::~MainWindow()
    {
        delete ui;
    }
     
    void MainWindow::paintEvent(QPaintEvent *event)
    {
        Q_UNUSED(event);//没有使用event,去掉之后会有警告
     
        QPainter painter(this);//下面三个渐变位置重叠了,注意及时注释以看到所有效果
     
        //线性渐变
        // 反走样
        painter.setRenderHint(QPainter::Antialiasing, true);
        // 设置渐变色
        QLinearGradient linear(QPointF(80, 80), QPointF(150, 150));
        linear.setColorAt(0, Qt::black);
        linear.setColorAt(1, Qt::white);
        // 设置显示模式
        linear.setSpread(QGradient::PadSpread);
        // 设置画笔颜色、宽度
        painter.setPen(QPen(QColor(0, 160, 230), 2));
        // 设置画刷填充
        painter.setBrush(linear);
        // 绘制椭圆
        painter.drawRect(QRect(40, 40, 180, 180));
     
     
        //锥形渐变
        // 反走样
        painter.setRenderHint(QPainter::Antialiasing, true);
        // 设置渐变色
        QRadialGradient radial(110, 110, 50, 130, 130);
        radial.setColorAt(0, Qt::black);
        radial.setColorAt(1, Qt::white);
        // 设置显示模式
        radial.setSpread(QGradient::ReflectSpread );
        // 设置画笔颜色、宽度
        painter.setPen(QPen(QColor(0, 160, 230), 2));
        // 设置画刷填充
        painter.setBrush(radial);
        // 绘制椭圆
        painter.drawRect(QRect(40, 40, 180, 180));
     
        //辐射渐变
        // 反走样
        painter.setRenderHint(QPainter::Antialiasing, true);
        // 设置渐变色
        QConicalGradient conical(110, 110, 45);
        conical.setColorAt(0, Qt::black);
        conical.setColorAt(1, Qt::white);
        // 设置画笔颜色、宽度
        painter.setPen(QPen(QColor(0, 160, 230), 2));
        // 设置画刷填充
        painter.setBrush(conical);
        // 绘制椭圆
        painter.drawRect(QRect(40, 40, 180, 180));
    }
    

    目前,我们提到了画笔、画刷和字体设置,另外QPainter还有其他影响图形和文字的绘制方式设置,这里简单提及一点:
    当背景模式是Qt::QpaqueMode时,背景画刷可以用来填充几何图形的背景、文字或者位图

    展开全文
  • QPainter.zip

    2019-12-19 14:40:08
    该资源整合了QPainter怎么绘图,QPainterPath的使用,以及通过时间过滤器来绘图。以及QLinerGradient、QConicalGradient、QRadialGradient三种渐变的使用,还绘制了一个等腰三角形。方便初学者学习
  • 运用Qpinter进行实时绘图,可以根据给定的矩阵进行图形绘制,每隔0.1s绘制一个点来构建图形。
  • QPainter文本转BMP32,QImage已经保存BMP图片已经不支持32位深的了,自动降到24位深,自己组织BMP信息保存成bmp32的图片
  • QPainter nwafu:CPP实习项目 1.贡献者 董培杰 惠良 王正宁 2.界面 3.功能 文件: 保存 另存为 打开 出口 图片 曲线 贝塞尔曲线 圈 长方形 文本 行动: 放大 缩小 zoom_1 旋转 功能模块: 文件处理模块 svg文件...
  • 因为事件过滤器的影响 无法直接使用QPainter类在子控件上实现画图操作,需使用eventFilter函数进行修改
  • 本资源为QPainter绘制基础图形(二),利用鼠标拖动绘制。
  • 主要为大家详细介绍了使用QPainter画一个3D正方体,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • QPainter详解

    千次阅读 2021-04-29 13:16:29
    1、QPainter类在小部件和其他绘制设备上执行低级绘制。 2、QPainter提供了高度优化的功能来完成大多数图形GUI程序所需的工作。它可以画从简单的线条到复杂的形状。它还可以绘制对齐的文本和像素图。QPainter可以对...

    一、描述

    1、QPainter类在小部件和其他绘制设备上执行低级绘制。

    2、QPainter提供了高度优化的功能来完成大多数图形GUI程序所需的工作。它可以画从简单的线条到复杂的形状。它还可以绘制对齐的文本和像素图。QPainter可以对继承QPaintDevice类的任何对象进行操作。

    3、QPainter与QPaintDeviceQPaintEngine类一起构成了Qt绘制系统的基础。QPainter是用于执行绘图操作的类。QPaintDevice表示可以使用QPainter在其上绘制的设备。QPaintEngine提供了一个接口,画家可以使用这个接口来绘制不同类型的设备。

    二、类型成员

    1、QPainter::CompositionMode。图像合成支持的模式。从实用的角度来看,默认的设置是最好的设置。官方有个“Composition Modes”例子展示了各种模式的效果。

    2、QPainter::PixmapFragmentHint

    • QPainter::OpaqueHint。指示要绘制的pixmap片段是不透明的。不透明碎片可能会更快地绘制。

    3、QPainter::RenderHint。指定QPainter的标志,绘制引擎可能会或不会遵守这些标志。

    • Antialiasing:图像边缘抗锯齿。
    • TextAntialiasing:文本抗锯齿。要强行禁用文本的抗锯齿功能,请不要设置:
        setRenderHint(QPainter::TextAntialiasing, false);

    而是应该在字体的样式策略上设置:

        auto font = this->font();
        font.setStyleHint(font.styleHint(),QFont::NoAntialias);
    • SmoothPixmapTransform:指示引擎应使用平滑pixmap变换算法绘制图片。
    • LosslessImageRendering:尽可能使用无损图像渲染。目前,此提示仅在使用QPainter通过QPrinter或QPdfWriter输出PDF文件时使用。

    三、实用成员函数

    1、QPainter(QPaintDevice *device)

    构造一个立即开始绘制绘制设备的QPainter对象。此构造函数对于临时的绘制者很方便,并且应该只使用一次。构造函数自动调用begin(),QPainter析构函数自动调用end()。

    以下代码效果一样:

         QPainter p;
         p.begin(this);
         p.drawLine(...);
         p.end();
         QPainter p(this);
         p.drawLine(...);

    2、bool begin(QPaintDevice *device)

    开始绘制绘画设备,如果成功则返回true,否则返回false。请注意,在调用begin()时,所有绘画工具设置(setPen(),setBrush()等)都将重置为默认值。

    调用此函数可能存在的错误:

     painter->begin(nullptr); //错误,绘制设备为空
    
     QPixmap image(0, 0);
     painter->begin(&image); //错误,图片为空
    
     painter->begin(myWidget);
     painter2->begin(myWidget); //错误,同一时间不能由两个QPainter绘制同一设备

    注:不支持在格式为QImage::Format_Indexed8QImage上绘制。

    3、QRectF boundingRect(const QRectF &rectangle, int flags, const QString &text)

    返回使用当前设置的font()使用指定标志在给定矩形内部绘制时显示的文本的边界矩形;即该函数告诉您在给定相同参数的情况下drawText()函数将在何处绘制。如果使用指定的标志文本不适合给定的矩形,则该函数返回所需的矩形。flags参数见下面的第30点。

    void Widget::paintEvent(QPaintEvent *event)
    {
        QPainter painter(this);
        painter.setPen(QPen(Qt::red,5));
        QRect rect = QRect(20,20,100,50);
        painter.drawRect(rect);
        QFont font = this->font();
        font.setPointSize(30);
        painter.setFont(font);
        painter.drawText(rect,Qt::AlignHCenter | Qt::TextWordWrap,"黄河之水天上来");
        painter.setPen(QPen(Qt::green,5));
        auto bRect = painter.boundingRect(rect,Qt::AlignHCenter | Qt::TextWordWrap,"黄河之水天上来");
        painter.drawRect(bRect);
    }

    红框是设置的要绘制的矩形。不过字太大了只能绘制两个字,绿色是要绘制这句诗实际上需要的边界矩形。

    4、QPoint brushOrigin()

    获取绘制开始的点。

        QPainter painter(this);
        painter.setRenderHint(QPainter::Antialiasing,true);
        painter.setPen(QPen(Qt::red,5));
        painter.drawEllipse(painter.brushOrigin(),5,5);
        painter.translate(50,50);
        painter.drawEllipse(painter.brushOrigin(),5,5);
        painter.setBrushOrigin(100,100);
        painter.drawEllipse(painter.brushOrigin(),5,5);

    5、void setClipRect(const QRectF &rectangle, Qt::ClipOperation operation = Qt::ReplaceClip)

    启用剪辑,并使用给定的剪辑操作将剪辑区域设置为给定的矩形。

    裁剪操作Qt::ClipOperation

    • Qt::NoClip:关闭裁剪。
    • Qt::ReplaceClip:将当前的裁剪路径/矩形/区域替换为函数调用中提供的路径/矩形/区域
    • Qt::IntersectClip:与当前裁剪路径/矩形/区域与函数调用中提供的路径相交。
    void Widget::paintEvent(QPaintEvent *event)
    {
        auto rect = event->rect();
        QPainter painter(this);
        painter.setRenderHint(QPainter::Antialiasing,true);
        painter.setPen(QPen(Qt::red,5));
        painter.setClipRect(rect.adjusted(20,20,-20,-20));
        painter.drawLine(rect.topLeft(),rect.bottomRight());
    }

    6、void setClipPath(const QPainterPath &path, Qt::ClipOperation operation = Qt::ReplaceClip)

    设置裁剪路径。

    void Widget::paintEvent(QPaintEvent *event)
    {
        auto rect = event->rect();
        QPainter painter(this);
        painter.setRenderHint(QPainter::Antialiasing,true);
        painter.setBrush(Qt::cyan);
        QPainterPath path;
        path.addRoundRect(rect.adjusted(20,20,-20,-20),60,60);
        painter.setClipPath(path);
        painter.drawRect(rect);
    }

    7、void setClipRegion(const QRegion &region, Qt::ClipOperation operation = Qt::ReplaceClip)

    设置裁剪区域,见QRegion详解

    8、void drawArc(const QRect &rect, int startAngle, int lenAngle)

    绘制圆弧。

        QPainter painter(this);
        painter.setRenderHint(QPainter::Antialiasing,true);
        painter.setPen(QPen(Qt::red,5));
        QRectF rectangle(10.0, 20.0, 80.0, 60.0);
        int startAngle = 30 * 16;
        int spanAngle = 120 * 16;
        painter.drawArc(rectangle, startAngle, spanAngle);
        painter.setPen(QPen(Qt::blue,3,Qt::DotLine));
        painter.drawRect(rectangle);

    9、void drawChord(const QRectF &rectangle, int startAngle, int spanAngle)

    绘制扇形,参数含义和绘制弧形一样。

        painter.drawChord(rectangle, startAngle, spanAngle);

    10、void drawConvexPolygon(const QPointF *points, int pointCount)

    绘制凸多边形(凸多边形的内角均小于或等于180°)。第一个点隐式连接到最后一个点,并且多边形被当前的brush()填充。

        QPainter painter(this);
        painter.setRenderHint(QPainter::Antialiasing,true);
        painter.setPen(QPen(Qt::red,3));
    
        static const QPointF points[4] = { QPointF(10.0, 80.0),
                                           QPointF(20.0, 10.0),
                                           QPointF(80.0, 30.0),
                                           QPointF(90.0, 70.0)};
        painter.drawConvexPolygon(points, 4);

    11、void drawConvexPolygon(const QPolygonF &polygon)

    绘制凸多边形,重载函数。

        QPolygonF polygon;
        polygon.append(QPointF(10.0, 80.0));
        polygon.append(QPointF(20.0, 10.0));
        polygon.append(QPointF(80.0, 60.0));
        painter.drawConvexPolygon(polygon);

    12、void drawEllipse(const QRectF &rectangle)

    绘制椭圆,参数是椭圆的外切矩形。

    13、void drawEllipse(const QPointF &center, qreal rx, qreal ry)

    绘制椭圆,参数为椭圆的中心和x、y方向的半径。

    14、void drawImage(const QRectF &target, const QImage &image, const QRectF &source, Qt::ImageConversionFlags flags = Qt::AutoColor)

    将给定图像的矩形部分(参数3)源绘制到绘制设备中的目标矩形(参数1)中。如果图像和矩形尺寸不相同,则将图像缩放以适合矩形。

        QPainter painter(this);
        QImage img(":/D:/eee.jpg");
        QRectF r{40,40,100,200};
        painter.drawImage(r,img);

        QPainter painter(this);
        QImage img(":/D:/eee.jpg");
        QRectF r{40,40,100,200};
        painter.drawImage(r,img,QRectF(30,30,200,400));

    15、void drawLine(const QLineF &line)

    绘制直线。QLineF

    16、void drawPath(const QPainterPath &path)

    使用当前的笔绘制轮廓并使用当前的笔刷绘制路径。QPainterPath

    17、void drawPie(const QRectF &rectangle, int startAngle, int spanAngle)

    绘制扇形。扇形被当前的brush()填充。必须以度的1/16来指定startAngle和spanAngle,即一个完整的圆等于5760(16 * 360)。角度的正值表示逆时针方向,而负值表示顺时针方向。参考上面的drawArc()示意图。

        QPainter painter(this);
        QRectF rectangle(10.0, 20.0, 80.0, 60.0);
        int startAngle = 30 * 16;
        int spanAngle = 120 * 16;
    
        painter.setPen(QPen(Qt::red,5));
        painter.drawPie(rectangle, startAngle, spanAngle);
        painter.setPen(QPen(Qt::blue,3,Qt::DotLine));
        painter.drawRect(rectangle);

    18、void drawPixmap(const QRectF &target, const QPixmap &pixmap, const QRectF &source)

    将给定像素图的矩形部分源绘制到绘画设备中的给定目标中。如果像素图和矩形大小不相同,则将像素图缩放为适合矩形。

        QPainter painter(this);
        QPixmap img(":/D:/eee.jpg");
        QRectF r{40,40,100,200};
        painter.drawPixmap(r,img,QRectF(30,30,200,400));

    19、void drawPixmap(const QPointF &point, const QPixmap &pixmap, const QRectF &source)

    在参数1的点处开始绘制参数3指定的图片区域,不会缩放

        QPainter painter(this);
        QPixmap img(":/D:/eee.jpg");
        painter.drawPixmap(QPointF(40,40),img,QRectF(30,30,200,400));

    20、void drawPixmap(const QPointF &point, const QPixmap &pixmap)

    在给定点开始绘制图片,不会缩放

    21、void drawPixmap(const QRect &rectangle, const QPixmap &pixmap)

    在矩形区域绘制图片,会缩放

    22、void drawPoint(const QPointF &position)

    绘制点。

        QPainter painter(this);
        painter.setRenderHint(QPainter::Antialiasing);
        painter.setPen(QPen(Qt::red,5));
        painter.drawPoint(QPointF(40,40));
        painter.setPen(QPen(Qt::red,15));
        painter.drawPoint(QPointF(60,60));

    22、void drawPoints(const QPointF *points, int pointCount)

    绘制数组中的点。

        QPainter painter(this);
        painter.setRenderHint(QPainter::Antialiasing);
        painter.setPen(QPen(Qt::red,5));
    
        static const QPointF points[4] = {
            QPointF(10.0, 80.0),
            QPointF(20.0, 10.0),
            QPointF(80.0, 30.0),
            QPointF(90.0, 70.0)
        };
        painter.drawPoints(points, 4);

    23、void drawPoints(const QPolygonF &points)

    绘制多边形中的点。

    24、void drawPolygon(const QPolygonF &points, Qt::FillRule fillRule = Qt::OddEvenFill)

    绘制多边形。QPolygon

    25、void drawPolyline(const QPointF *points, int pointCount)

    绘制折线。

        QPainter painter(this);
        painter.setRenderHint(QPainter::Antialiasing);
        painter.setPen(QPen(Qt::red,5));
    
        static const QPointF points[3] = {
            QPointF(10.0, 80.0),
            QPointF(20.0, 10.0),
            QPointF(80.0, 30.0),
        };
        painter.drawPolyline(points, 3);

    26、void drawPolyline(const QPolygonF &points)

    绘制折线。

        QPainter painter(this);
        painter.setRenderHint(QPainter::Antialiasing);
        painter.setPen(QPen(Qt::red,5));
        QPolygon polygon = QPolygon();
        polygon << QPoint(22,33)<<QPoint(78,45)<<QPoint(111,233)<<QPoint(234,88)<<QPoint(34,89);
        painter.drawPolyline(polygon);

    27、void drawRect(const QRectF &rectangle)

    绘制矩形。QRectF

    28、void drawRoundedRect(const QRectF &rect, qreal xRadius, qreal yRadius, Qt::SizeMode mode = Qt::AbsoluteSize)

    绘制圆角矩形。见QPainterPath

    29、void drawText(const QPointF &position, const QString &text)

    从给定位置开始,以当前定义的文本方向绘制给定文本。此函数不处理换行符(\ n),因为它不能将文本分成多行,也不能显示换行符。默认情况下,QPainter绘制抗锯齿的文本

    30、void drawText(const QRectF &rectangle, int flags, const QString &text, QRectF *boundingRect = nullptr)

    在提供的矩形内绘制给定的文本。矩形以及对齐标记定义了文本的锚点。

        auto rect = event->rect();
        QPainter painter(this);
        painter.setPen(QPen(Qt::red,5));
        painter.drawText(rect, Qt::AlignCenter, "黄河之水天上来\n奔流到海不复回");

    参数4是绘制的文本的外接矩形,例:

        auto rect = event->rect();
        QPainter painter(this);
        painter.setPen(QPen(Qt::red,5));
        QRectF boundingRect;
        painter.drawText(rect, Qt::AlignCenter, "黄河之水天上来\n奔流到海不复回", &boundingRect);
        painter.setPen(QPen(Qt::cyan,3,Qt::DotLine));
        painter.drawRect(boundingRect);

    参数2文本标识单独使用时的效果:

    • Qt::AlignLeft:文本靠左。
    • Qt::AlignRight:文本靠右。
    void Widget::paintEvent(QPaintEvent *event)
    {
        auto rect = event->rect();
        QPainter painter(this);
        painter.setPen(QPen(Qt::red,5));
        QFont font;
        font.setPixelSize(40);
        painter.setFont(font);
        painter.drawText(rect,Qt::AlignRight, "黄河之水天上来\n奔流到海不复回哈哈哈");
    }

    • Qt::AlignHCenter:水平方向居中。

    • Qt::AlignJustify:两端对齐,无效,原因未知。
    • Qt::AlignTop:文本靠上。
    • Qt::AlignBottom:文本靠下。
    • Qt::AlignVCenter:垂直方向居中。

    • Qt::AlignCenter:水平和垂直方向居中。
    • Qt::TextSingleLine:保持文本单行,把换行符当做空格。
        painter.drawText(rect,Qt::TextSingleLine, "黄河之水天上来\n奔流到海不复回哈哈哈");

    •  Qt::TextExpandTabs:这个资料语焉不详,我推测作用是复制一个制表符。
    void Widget::paintEvent(QPaintEvent *event)
    {
        auto rect = event->rect();
        QPainter painter(this);
        painter.setPen(QPen(Qt::red,5));
        QFont font;
        font.setPixelSize(40);
        painter.setFont(font);
        QString text = "A\tA";
        painter.drawText(rect,Qt::TextExpandTabs, text);
        painter.drawText(QPointF(0,80),text);
    
        auto bRect = painter.boundingRect(rect,Qt::TextExpandTabs,text);
        painter.drawRect(bRect);
    }

    使用这个标识之后多出了一个制表符空间。

    • Qt::TextShowMnemonic:将字符串“&P”显示为P。对于&号,请使用“&&”。例:
        QString text = "&ABC";
        painter.drawText(rect,Qt::TextShowMnemonic, text);
        painter.drawText(QPointF(0,80),text);

     

    • Qt::TextWordWrap:文字自动换行。

    31、void drawText(const QRectF &rectangle, const QString &text, const QTextOption &option = QTextOption())。

        QTextOption option(Qt::AlignLeft | Qt::AlignVCenter);
        option.setTextDirection(Qt::RightToLeft);
        painter.drawText(rect,"黄河之水天上来",option);

    32、void drawTiledPixmap(const QRectF &rectangle, const QPixmap &pixmap, const QPointF &position = QPointF())

    绘制平铺图片。绘制从图片中参数3的位置开始绘制。

        QPixmap pixmap(":/D:/666666.PNG");
        painter.drawTiledPixmap(rect,pixmap,QPointF(100,100));

    33、void eraseRect(const QRectF &rectangle)

    擦除区域。

    相当于:

        fillRect(rectangle, background());

    34、bool end()

    结束绘画。 释放绘画时使用的所有资源。

    35、void fillPath(const QPainterPath &path, const QBrush &brush)

    填充路径,但不绘制轮廓。

        QPainterPath path;
        path.cubicTo(QPointF(0,0),QPointF(200,200),QPointF(150,20));
        painter.fillPath(path,Qt::cyan);

    36、void fillRect(const QRect &rectangle, const QBrush &brush)

    填充矩形,可用颜色、画刷、渐变、画刷类型填充。

    37、bool isActive()

    是否已调用begin()而尚未调用end()。

    38、void resetTransform()

    重置使用translate(),scale(),shear(),rotate(),setWorldTransform(),setViewport()和setWindow()进行的所有转换。

    39、void restore()

    恢复当前的QPainter状态(从堆栈弹出保存的状态)。

    40、void save()

    保存当前的画家状态(将状态推送到堆栈上)。 在save()之后必须有一个相应的restore()。(end()函数会展开堆栈)

    41、void rotate(qreal angle)

    顺时针旋转坐标系。

        QPainter painter(this);
        painter.setPen(QPen(Qt::red,5));
        painter.translate(150,150);
        painter.drawText(QPointF(0,0),"黄河之水天上来");
        painter.rotate(90);
        painter.drawText(QPointF(0,0),"黄河之水天上来");
        painter.rotate(90);
        painter.drawText(QPointF(0,0),"黄河之水天上来");
        painter.rotate(90);
        painter.drawText(QPointF(0,0),"黄河之水天上来");

    42、void scale(qreal sx, qreal sy)

    坐标x、y轴缩放相应比例。

    43、void setBackground(const QBrush &brush)

    设置背景画刷。背景画刷是在绘制不透明文本、填充画刷样式和绘制位图时填充的画刷。背景笔刷在透明背景模式下没有效果(默认设置)。

    void Widget::paintEvent(QPaintEvent *event)
    {
        auto rect = event->rect();
        QPainter painter(this);
        painter.setBackgroundMode(Qt::OpaqueMode);
        painter.setBackground(Qt::cyan);
        painter.fillRect(rect,Qt::CrossPattern);
    }

        QPainter painter(this);
        painter.setBackgroundMode(Qt::OpaqueMode);
        painter.setBackground(Qt::cyan);
        painter.setPen(QPen(Qt::red,5));
        painter.drawText(QPointF(55,55),"黄河之水天上来");

    绘制位图:

        auto rect = event->rect();
        QPainter painter(this);
        painter.setBackgroundMode(Qt::OpaqueMode);
        painter.setBackground(Qt::cyan);
        QBitmap img(":/D:/qqq.jpeg");
        painter.drawPixmap(rect,img);

    44、void setBackgroundMode(Qt::BGMode mode)。

    设置背景模式。

    Qt::BGMode:

    • Qt::TransparentMode:(默认设置)绘制不透明文本、填充画刷样式和绘制位图时无需设置背景像素。
    • Qt::OpaqueMode:用当前背景色填充不透明文本、画刷样式和位图的背景像素。

    45、void setOpacity(qreal opacity)

    设置透明度。值为0.0~1.0。

    46、void setWorldTransform(const QTransform &transform, bool combine = false)

    设置变换矩阵。见QTransform。如果参数2是true,将与当前矩阵的变换效果合并,否则替换当前变换矩阵。

        QPainter painter(this);
        auto rectPoint = event->rect().center();
    
        QTransform transform;
        transform.translate(rectPoint.x(),rectPoint.y());
        painter.setWorldTransform(transform);
    
        QTransform transform2;
        transform2.rotate(45);
        painter.setWorldTransform(transform2,true);
    
        painter.setPen(QPen(Qt::cyan, 3, Qt::DashDotLine));
        painter.drawRect(0, 0, 100, 100);

    设置了两个变换矩阵,一个效果是平移,一个效果是旋转,第一次设置平移效果,第二次设置旋转和平移效果合并,即有平移和旋转两种效果。

    注:setTransform() 和 setWorldTransform()这俩没区别,查看源码发现setTransform实际上就是调用setWorldTransform:

    47、void setWindow(const QRect &rectangle)

    设置窗口转换矩形。见窗口-视口转换

    48、void setViewTransformEnabled(bool enable)

    设置是否启用窗口-视口转换。设置为false则相当于setWindow()的设置无效。

    49、void setViewport(const QRect &rectangle)

    设置视口。见窗口-视口转换

    50、void setWorldMatrixEnabled(bool enable)

    设置是否启用变换矩阵,设为false则相当于setTransform()的设置无效。

    51、void shear(qreal sh, qreal sv)

    剪切坐标,见QTransform

    52、void strokePath(const QPainterPath &path, const QPen &pen)

    使用指定的画笔描绘路径轮廓,其内部实际上是调用drawPath()。

     53、void translate(qreal dx, qreal dy)

    平移绘制坐标。

        QPainter painter(this);
        painter.translate(50,50);
        painter.drawText(QPointF(0,0),"黄河之水天上来");

    展开全文
  • 随机生成一组数据,QT用Qpainter绘制实时曲线图最简单的折线图
  • 官方文档给出的建议是混合QPainter使用。本文档就是介绍怎么用QPainter来在OPengl窗口上绘制2D文本、 最近在用webRTC做直播的时候,需要在视频窗口左边下角显示用户名。视频是yuv420p格式,在QOpenGLWidget中用着色...

    QOpenGLWidget取代了之前的QGLWidget类,用以在Qt中提供OpenGL的编程接口。在QGLWidget类中,我们可以通过方法drawTexture来绘制文本。但是在QOpenGLWidget类的时候,这个方法没有提供了。官方文档给出的建议是混合QPainter使用。本文档就是介绍怎么用QPainter来在OPengl窗口上绘制2D文本、
    最近在用webRTC做直播的时候,需要在视频窗口左边下角显示用户名。视频是yuv420p格式,在QOpenGLWidget中用着色器渲染,用户名的话,用QPanter绘制最为方便。

    一.效果

    这个背景log是一帧yuv图像,用jpg转换而来。用ffmpeg将jpg转换为yuv的指令如下:
    ffmpeg -i Background.jpg -s 400x300 -pix_fmt yuv420p Background.yuv
    转换后用ffplay试下能否正常播放,指令如下:
    ffplay -f rawvideo -video_size 400x300 Background.yuv
    混合渲染的时候有些注意事项,在后文中列出。否则可能会出现文字能正常绘制,但是视频画面为白色的情况。

    二.源码

    ZgVideoOpenGLWidget.h

    #ifndef ZGVIDEOOPENGLWI
    展开全文
  • 利用 QPainter实现雷达图(玫瑰图)======
  • QPainter显示视频流

    2018-07-10 09:13:35
    QPainter显示视频流,没有使用QLabel,其中有封装好的视频读取类。
  • QPainter可以绘制几何形状(点、线、矩形、椭圆、弧形、弦形、饼状图、多边形和贝塞尔曲线)
  • qpainter 画笔 (画线)

    2015-08-28 16:52:24
    qt qml QPainter画笔实例(画线) 有简单的 笔触
  • QOpenglWindow 和QPainter混合渲染的示例代码,这个在我机器上能够运行,显卡 英伟达 9800Gt win7 64 位系统。
  • QPainter文档

    2020-09-18 14:11:19
    QPainter提供了高度优化的功能来完成大多数绘图GUI程序所需的功能。它可以画任何东西,从简单的线条到复杂的形状,如pies and chords。它还可以绘制对齐文本和像素映射。通常情况下,它绘制的是一个“自然”坐标系,...

    QPaint类在widget和其他绘制设备上执行底层绘制。
    QPainter提供了高度优化的功能来完成大多数绘图GUI程序所需的功能。它可以画任何东西,从简单的线条到复杂的形状,如pies and chords。它还可以绘制对齐文本和像素映射。通常情况下,它绘制的是一个“自然”坐标系,但它也可以进行视图和世界转换。QPainter可以对继承QPaintDevice类的任何对象进行操作。QPainter的常见用法是在widget的paint事件中:构造和定制(例如设置钢笔或画笔)painter。然后画。记住在绘图后销毁QPainter对象。例程:

    void SimpleExampleWidget::paintEvent(QPaintEvent *)
      {
          QPainter painter(this);
          painter.setPen(Qt::blue);
          painter.setFont(QFont("Arial", 30));
          painter.drawText(rect(), Qt::AlignCenter, "Qt");
      }

    QPainter的核心功能是绘图,但是该类还提供了几个函数,允许您自定义QPainter的设置和渲染质量,以及其他支持剪切的函数。此外,您可以通过指定painter的构图模式来控制如何将不同的形状合并在一起。
    isActive() 函数的作用是:指示painter是否处于活动状态。painter由begin()函数和接受QPaintDevice参数的构造函数激活。由end()函数和析构函数将其停用。
    与QPaintDevice和QPaintEngine类一起,QPainter构成了Qt绘制系统的基础。QPainter是用于执行绘图操作的类。QPaintDevice表示可以使用QPainter在其上绘制的设备。QPaintEngine提供了painter用于绘制不同类型设备的接口。如果painter处于活动状态,device()返回painter在其上绘制的绘制设备,paintEngine()返回painter当前正在运行的绘制引擎。有关详细信息,请参见Paint System。
    有时,让别人在一个不寻常的QPaintDevice上画画是可取的。qpaiter支持一个静态函数setRedirected()来完成这项工作。
    警告:当paintdevice是一个小部件时,QPainter只能在paintEvent()函数中或在paintEvent()调用的函数中使用。

    Settings

    您可以自定义以下几种设置,以根据您的首选项进行QPainter绘制:

    1. font()是用于绘制文本的字体。如果painter isActive(),则可以分别使用fontInfo()和fontMetrics()函数检索有关当前设置字体及其规格的信息。
    2. brush()定义用于填充形状的颜色或图案。
    3. pen()定义用于绘制线条或边界的颜色或stipple。
    4. backgroundMode()定义是否有background(),即它是Qt::OpaqueMode或Qt::TransparentMode。
    5. background()仅适用于backgroundMode()为Qt::OpaqueMode且pen()为stipple时。在这种情况下,它描述了点画中背景像素的颜色。
    6. brushOrigin()定义平铺画笔的原点,通常是widget背景的原点。
    7. viewport()、window()、worldTransform()构成了painter的坐标变换系统。有关详细信息,请参见Coordinate Transformations 和 Coordinate System 文档。
    8. hasClipping()告诉painter是否进行剪辑。(painter device也会进入。)如果painter clip,则会进入clipregin()。
    9. layoutDirection()定义绘制文本时使用的布局方向。
    10. worldMatrixeEnabled()指示是否启用world转换。
    11. viewTransformEnabled()指示是否启用视图转换。

    Note:其中一些设置会镜像某些绘制设备(例如QWidget::font())中的设置。QPainter::begin()函数(或等效的qpaint构造函数)从绘制设备复制这些属性。您可以随时通过调用save()函数保存内部堆栈上的所有可用设置来保存QPainter的状态。restore()函数将它们弹出。

    Drawing

    QPainter提供了绘制大多数基本体的函数:drawPoint()、drawPoints()、drawLine()、drawRect()、drawRoundedRect()、drawAllipse()、drawArc()、drawPie()、drawChord()、drawPolyline()、drawPolygon()、DrawConverXPolyGon()和drawCubicBezier()。两个方便的函数drawRects()和drawLines()使用当前的笔和画笔在给定的QRects或qline数组中绘制给定数量的矩形或直线。
    qpaint类还提供fillRect()函数,该函数用给定的QBrush填充给定的QRect,以及擦除给定矩形内区域的eraseRect()函数。
    所有这些函数都有整数和浮点版本。

    如果需要绘制复杂的形状,特别是需要反复绘制,请考虑创建一个QPainterPath并使用drawPath()绘制它。

    Painter Paths example

    QPainterPath类提供了一个用于绘制操作的容器,使图形形状能够被构造和重用。
    Painter Paths示例显示了如何使用Painter paths构建复杂的图形进行渲染。

    QPainter还提供了fillPath()函数,该函数用给定的QBrush填充给定的QPainterPath,以及绘制给定路径轮廓的strokePath()函数(即笔划路径)。

    另请参见 Vector Deformation 示例,该示例演示如何使用高级向量技术来使用QPainterPath绘制文本,渐变示例显示Qt中可用的不同类型的渐变,以及路径笔划示例,该示例显示Qt的内置短划线图案,并显示如何使用自定义图案来扩展范围可用模式。
    在这里插入图片描述
    使用drawText()完成文本绘制。当需要细粒度定位时,boundingRect()会告诉您给定的drawText()命令将在何处绘制。

    Drawing Pixmaps and Images

    有绘制pixmaps/images的函数,分别是drawPixmap()、drawImage()和drawTiledPixmap()。drawPixmap()和drawImage()产生相同的结果,除了drawPixmap()在屏幕上更快,而drawImage()在QPrinter或其他设备上可能更快。
    有一个drawPicture()函数可以绘制整个QPicture的内容。drawPicture()函数是唯一一个忽略painter设置的函数,因为QPicture有自己的设置。

    Drawing High Resolution Versions of Pixmaps and Images

    pixmaps的高分辨率版本的设备像素比率值大于1(请参见QImageReader,QPixmap::devicePixelRatio())。如果它与底层QPaintDevice的值匹配,它将直接绘制到设备上,而不应用其他转换。
    例如,当将设备像素比为2的64x64像素大小的QPixmap绘制到设备像素比也为2的高DPI屏幕上时的情况。请注意,pixmap实际上是32x32像素的用户空间。Qt中基于pixmap大小计算布局几何图形的代码路径将使用此大小。这样做的最终效果是pixmap显示为高DPI pixmap,而不是大pixmap。

    Rendering Quality

    要使用QPaiter获得最佳渲染结果,应该使用独立于平台的QImage作为绘制设备;即使用QImage将确保结果在任何平台上具有相同的像素表示。
    QPaiter类还提供了一种通过其renderInt枚举和对浮点精度的支持来控制渲染质量的方法:用于绘制基本体的所有函数都有一个浮点版本。它们通常与QPainter::Antialiasing 呈现提示结合使用。

    Concentric Circles Example

    Concentric Circles示例显示了在绘制自定义窗口小部件时使用浮点精度和消除混叠可以提高渲染质量。
    应用程序的主窗口显示几个小部件,这些小部件是使用精度和抗锯齿的各种组合绘制的。
    在这里插入图片描述
    renderInt枚举指定给QPainter的标志,这些标志可能被任何给定的引擎所尊重,也可能不被任何给定的引擎所尊重。qpaiter::Antialiasing表示引擎应尽可能对基元的边缘进行抗锯齿处理,qpaint::TextAntialiasing表示引擎应尽可能对文本进行抗锯齿处理,而qPaint::SmoothPixmapTransform表示引擎应使用平滑的pixmap转换算法。
    函数的作用是:返回一个标志,指定为此绘制器设置的渲染提示。使用setRenderInt()函数可以设置或清除当前设置的renderInts。

    Member Type Documentation

    enum QPainter::CompositionMode
    定义数字图像合成支持的模式。合成模式用于指定如何将一个图像(源)中的像素与另一个图像(目标)中的像素合并。
    请注意,用RasterOp前缀表示的按位光栅操作模式仅在X11和光栅绘制引擎中受本机支持。这意味着在Mac上使用这些模式的唯一方法是通过QImage。带有alpha组件的笔和画笔不支持RasterOp表示的混合模式。此外,启用QPainter::Antialiasing 呈现提示将有效地禁用RasterOp模式。
    在这里插入图片描述
    最常见的类型是SourceOver(通常称为alpha混合),其中源像素混合在目标像素的顶部,这样源的alpha分量定义像素的半透明性。
    几种合成模式需要在源图像或目标图像中使用alpha通道才能产生效果。为了获得最佳性能,首选的图像格式是Format_ARGB32_Premultiplied。
    设置构图模式后,它适用于所有的painting operator, pens, brushes, gradients and pixmap/image drawing。

    enum QPainter::RenderHint

    renderInts用于为QPainter指定任何给定引擎都可能遵守或不遵守的标志。

    Member Function Documentation

    注:设备坐标(Device Coordinate)又称为物理坐标(Physical Coordinate),是指输出设备上的坐标。通常将屏幕上的设备坐标称为屏幕坐标。设备坐标用对象距离窗口左上角的水平距离和垂直距离来指定对象的位置,是以像素为单位来表示的,设备坐标的X轴向右为正,Y轴向下为正,坐标原点位于窗口的左上角。

    逻辑坐标(Logical Coordinate)是系统用作记录的坐标。在缺省的模式(MM_TEXT)下,逻辑坐标的方向和单位与设备坐标的方向和单位相同,也是以像素为单位来表示的,X轴向右为正,Y轴向下为正,坐标原点位于窗口的左上角。逻辑坐标和设备坐标即使在缺省模式下其数值也未必一致,除了在以下两种情况下:
      1. 窗口为非滚动窗口
      2. 窗口为滚动窗口,但垂直滚动条位于滚动边框的最上端,水平滚动条位于最左端,但如果移动了滚动条这两种坐标就不一致了。
     
     逻辑坐标按照坐标设置方式(又成为映射模式)可分为8种,它们在坐标上的特性如下表所示:

    映射模式逻辑单位x递增方向y递增方向
    MM_TEXT像素向右向下
    MM_LOMETRIC0.1mm向右向上
    MM_HIMETRIC0.01mm向右向上
    MM_LOENGLISH0.01inch向右向上
    MM_HIENGLISH0.001inch向右向上
    MM_TWIPS1/1440inch向右向上
    MM_ISOTROPIC可调整 (x=y)可选择可选择
    MM_ANISOTROPIC可调整(x!=y)可选择可选择
    函数解析
    QPainter::QPainter()构造函数
    QPainter::QPainter(QPaintDevice *device)构造函数
    const QBrush &QPainter::background() const返回当前画笔样式
    Qt::BGMode QPainter::backgroundMode() const返回当前背景模式
    bool QPainter::begin(QPaintDevice *device)开始绘制绘制设备,如果成功则返回true;否则返回false。请注意,调用begin()时,所有painter设置(setPen()、setBrush()等)都将重置为默认值。注:QPainterDevice不能为0,不能为空的QPixmap,同一时间只能有一个painter
    void QPainter::beginNativePainting()刷新绘制管道,并为用户直接向底层图形上下文发出命令做好准备。必须和endNativePainting()成对调用,请注意,只有底层绘制引擎更改的状态才会重置为各自的默认状态。我们重置的状态可能会随着版本的不同而变化
    QRectF QPainter::boundingRect(const QRectF &rectangle, int flags, const QString &text)返回使用当前设置的font()在给定矩形内使用指定标志绘制时文本的边界矩形;也就是说,当给定相同的参数时,函数会告诉您drawText()函数将在何处绘制。如果使用指定的标志,文本不适合给定的矩形,则函数将返回所需的矩形
    QRect QPainter::boundingRect(const QRect &rectangle, int flags, const QString &text)同上
    QRect QPainter::boundingRect(int x, int y, int w, int h, int flags, const QString &text)同上
    QRectF QPainter::boundingRect(const QRectF &rectangle, const QString &text, const QTextOption &option = QTextOption())基本同上,此重载函数不将标志指定为Qt::AlignmentFlag和Qt::TextFlag的位“或”,而是接受option参数。QTextOption类提供常规富文本属性的描述。
    const QBrush &QPainter::brush() const返回当前画笔
    QPoint QPainter::brushOrigin() const返回当前设置的画笔原点
    QRectF QPainter::clipBoundingRect() const如果有剪辑,则返回当前剪辑的边框;否则返回空矩形。请注意,剪辑区域是以逻辑坐标表示的。不能保证边框是tight的
    QPainterPath QPainter::clipPath() const以逻辑坐标返回当前剪辑路径,警告:QPainter没有显式地存储组合的剪辑,因为这是由底层QPaintEngine处理的,因此将根据需要重新创建路径并将其转换为当前的逻辑坐标系。这可能是一项昂贵的操作
    QRegion QPainter::clipRegion() const返回当前设置的剪辑区域。请注意,剪辑区域是以逻辑坐标表示的。警告:QPainter没有显式地存储组合的剪辑,因为这是由底层QPaintEngine处理的,因此将根据需要重新创建路径并将其转换为当前的逻辑坐标系。这可能是一项昂贵的操作
    QTransform QPainter::combinedTransform() const返回组合当前窗口/视口和世界变换的变换矩阵
    QPainter::CompositionMode QPainter::compositionMode() const返回当前合成模式
    QPaintDevice *QPainter::device() const返回此绘制器当前正在其上绘制的绘制设备,如果绘制器未处于活动状态,则返回0
    const QTransform &QPainter::deviceTransform() const返回从依赖于平台的绘制设备的逻辑坐标转换为设备坐标的矩阵。仅当在依赖于平台的句柄(Qt::handle)上使用平台绘制命令时才需要此函数,而平台本身不进行转换
    void QPainter::drawArc(const QRectF &rectangle, int startAngle, int spanAngle)绘制由给定rectAngle、startAngle和spanAngle定义的圆弧。startAngle和spanAngle的值为1是表示1/16度,即一个完整的圆等于5760(16*360)。角度的正值表示逆时针方向,负值表示顺时针方向。零度在3点钟位置,startAngle为画弧线的起始角度,spanAngle为弧线跨越的角度
    void QPainter::drawArc(const QRect &rectangle, int startAngle, int spanAngle)同上
    void QPainter::drawArc(int x, int y, int width, int height, int startAngle, int spanAngle)同上
    void QPainter::drawChord(const QRectF &rectangle, int startAngle, int spanAngle)同上,但画的是弓形
    void QPainter::drawChord(int x, int y, int width, int height, int startAngle, int spanAngle)同上
    void QPainter::drawChord(const QRect &rectangle, int startAngle, int spanAngle)同上
    展开全文
  • 2.保证无毒 3.简单,方便,实用 4.实例可以自行改用 5.如有非法,本人无法律责任,由改动代码人负责! 6.需要更多本人作品,查找标签“朱建强” 7.请下载,杀毒后再使用!
  • 简单的QPainter时间轴绘制,实现刻度的缩放,移动,值对应
  • 2.保证无毒 3.简单,方便,实用 4.实例可以自行改用 5.如有非法,本人无法律责任,由改动代码人负责! 6.更多本人作品,查找标签“朱建强” 7.请下载,杀毒后再使用!
  • paintEvent函数使用QPainter进行图形的绘制;最后绘制出台历效果的时间;
  • Qpainter事件

    2020-06-02 17:30:42
    Qpainter事件使用说明 1 顺时针旋转坐标系 2 在图中写入文字 2.1 写入文字 2.2 字体设置 2.3 画笔颜色与宽度设置 2.3 画刷颜色设置 3 变换坐标原点位置画直线 4 Qpainter绘制图形常用线条 4.1 基于Qpainter添加图形...
  • qt video,从基础开始,第13部分,一共14部分,使用vs2015的addin作为教学工具,很不错的。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,426
精华内容 6,970
关键字:

qpainter