QPainter简单应用举例和深入分析

1.概要

任何显示器上的东西都是花上去的,怎么画的呢?用QPainter画的?

怎么画呢,用QPainter可以接受的方式,告诉他画什么,他就画

2.内容

1.简单应用

下面是一个使用QPainter创建的最简单的完整例子。这个例子展示了如何在一个QWidget子类中重载paintEvent方法,并使用QPainter在窗口上绘制一个简单的红色矩形。

首先,你需要创建一个QWidget子类,并在这个子类中实现paintEvent方法。然后,你可以创建一个这个子类的实例,并显示它。

#include <QApplication>  
#include <QWidget>  
#include <QPainter>  
  
// 创建一个继承自QWidget的类  
class MyWidget : public QWidget {  
protected:  
    // 重载paintEvent方法  
    void paintEvent(QPaintEvent* event) override {  
        // 创建一个QPainter对象,并将它与此QWidget关联  
        QPainter painter(this);  
  
        // 设置画笔颜色为红色  
        painter.setPen(Qt::red);  
        // 设置画刷颜色也为红色  
        painter.setBrush(Qt::red);  
  
        // 绘制一个矩形,起点(x, y),宽度和高度  
        painter.drawRect(50, 50, 200, 100);  
    }  
};  
  
int main(int argc, char *argv[]) {  
    QApplication app(argc, argv);  
  
    // 创建MyWidget的实例  
    MyWidget widget;  
    // 设置窗口大小  
    widget.resize(300, 200);  
    // 显示窗口  
    widget.show();  
  
    // 进入Qt应用程序的主循环  
    return app.exec();  
}

在这个例子中,我们创建了一个名为MyWidget的类,它继承自QWidget。在MyWidget类中,我们重载了paintEvent方法,这是QWidget类中用于处理绘制事件的方法。每当窗口需要重绘时,Qt都会调用这个方法。

paintEvent方法中,我们创建了一个QPainter对象,并将它与当前的QWidget(即this指针所指向的对象)关联起来。然后,我们设置了画笔和画刷的颜色为红色,并调用drawRect方法在窗口上绘制了一个矩形。

最后,在main函数中,我们创建了QApplication对象,这是每个Qt应用程序都必须有的。然后,我们创建了MyWidget的实例,设置了窗口的大小,并显示了窗口。最后,我们调用了app.exec()进入了Qt应用程序的主循环,等待用户的输入事件。

编译并运行这个程序,你将看到一个包含红色矩形的窗口。

运行结果

2.调整实验-添加文字

#include <QApplication>
#include <QWidget>
#include <QPainter>

// 创建一个继承自QWidget的类
class MyWidget : public QWidget {
protected:
    // 重载paintEvent方法
    void paintEvent(QPaintEvent* event) override {
        // 创建一个QPainter对象,并将它与此QWidget关联
        QPainter painter(this);

        // 设置画笔颜色为红色
        painter.setPen(Qt::blue);
        // 设置画刷颜色也为红色
        painter.setBrush(Qt::red);

        // 绘制一个矩形,起点(x, y),宽度和高度
        painter.drawRect(50, 50, 200, 100);
        // 设置字体
        QFont font;
        font.setFamily("Microsoft YaHei");
        font.setPointSize(50);
        font.setItalic(true);
        painter.setFont(font);

        // 绘制文本
        painter.drawText(rect(), Qt::AlignCenter, "Qt");
    }
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 创建MyWidget的实例
    MyWidget widget;
    // 设置窗口大小
    widget.resize(300, 200);
    // 显示窗口
    widget.show();

    // 进入Qt应用程序的主循环
    return app.exec();
}

 

3.简化-只留添加文本

#include <QApplication>
#include <QWidget>
#include <QPainter>

// 创建一个继承自QWidget的类
class MyWidget : public QWidget {
protected:
    // 重载paintEvent方法
    void paintEvent(QPaintEvent* event) override {
        // 创建一个QPainter对象,并将它与此QWidget关联
        QPainter painter(this);

        // 设置画笔颜色为红色
        painter.setPen(Qt::blue);
        // 设置画刷颜色也为红色
        //painter.setBrush(Qt::red);

        // 绘制一个矩形,起点(x, y),宽度和高度
        //painter.drawRect(50, 50, 200, 100);
        // 设置字体
        QFont font;
        font.setFamily("Microsoft YaHei");
        font.setPointSize(50);
        font.setItalic(true);
        painter.setFont(font);

        // 绘制文本
        painter.drawText(rect(), Qt::AlignCenter, "Qt");
    }
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 创建MyWidget的实例
    MyWidget widget;
    // 设置窗口大小
    widget.resize(300, 200);
    // 显示窗口
    widget.show();

    // 进入Qt应用程序的主循环
    return app.exec();
}

2.QPainter

QPainter是Qt框架中的一个类,主要用于在各种设备上进行2D图形绘制,如窗口、位图、打印设备等。以下是关于QPainter的详细介绍:

一、QPainter的功能

QPainter提供了一系列绘图函数,可以实现绘制点、线、曲线、形状、文本、图像以及复杂的绘画操作。具体来说,QPainter可以执行以下操作:

  • 绘制各种基本形状,如线条、矩形、圆形、椭圆等。
  • 绘制文本。
  • 绘制图像。
  • 设置画笔和画刷的属性,如颜色、样式、宽度等。
  • 进行坐标变换、裁剪、合成等操作。

二、QPainter的使用

1. 创建QPainter对象
  • 通常在绘图事件处理函数中创建QPainter对象。例如,在QWidget的paintEvent函数中创建QPainter对象,以便在窗口上进行绘图。
  • 构造函数QPainter::QPainter(QPaintDevice *device)用于初始化一个新的QPainter对象,并将其与指定的QPaintDevice相关联。QPaintDevice是所有可被QPainter绘制的设备的基类,包括窗口(如QWidget)、位图(如QPixmap或QImage)等。
2. 设置绘图属性
  • 使用setPen(const QPen &pen)函数设置画笔属性,如颜色、样式、宽度等。
  • 使用setBrush(const QBrush &brush)函数设置画刷属性,如颜色、样式等。QBrush定义了绘画区域的填充样式,可以是纯色、渐变或图案。
3. 进行绘图操作
  • 使用QPainter对象提供的各种绘图函数进行绘图操作。例如,drawLine(int x1, int y1, int x2, int y2)用于绘制直线,drawRect(const QRect &rectangle)用于绘制矩形,drawEllipse(const QRect &rectangle)用于绘制椭圆,drawText(int x, int y, const QString &text)用于绘制文本。
4. 结束绘图
  • 绘图完成后,需要调用QPainter对象的end()函数来结束绘图操作。

三、QPainter的高级特性

  • QPainter支持双缓冲技术,可以提高绘图性能并减少闪烁。
  • QPainter支持图像合成,可以通过设置不同的合成模式来实现复杂的图像效果。
  • QPainter提供了丰富的渲染提示(RenderHint),如抗锯齿(Antialiasing)和文本抗锯齿(TextAntialiasing),可以改善绘图质量。

四、示例代码

以下是一个使用QPainter在QWidget上绘制矩形和文本的示例代码:

void MyWidget::paintEvent(QPaintEvent *event) {  
    QPainter painter(this); // 在当前窗口上进行绘图  
    painter.setPen(Qt::blue); // 设置画笔颜色为蓝色  
    painter.setBrush(Qt::red); // 设置画刷颜色为红色  
    painter.drawRect(50, 50, 100, 100); // 绘制一个矩形  
    painter.drawText(50, 200, "Hello, QPainter!"); // 绘制文本  
}

在这个示例中,我们在一个自定义的QWidget子类中重写了paintEvent函数,并在该函数中创建了一个QPainter对象,然后使用它来绘制了一个矩形和一段文本。

总的来说,QPainter是Qt框架中非常强大的绘图工具,通过它可以实现各种复杂的绘图操作,为Qt应用程序增添更多的视觉效果和交互性。

 3.QPainter 常用接口

QPainter是Qt框架中的一个绘图类,用于在QWidget或QImage等绘图设备上进行2D图形的绘制。它提供了丰富的接口和功能,以下是一些QPainter的常用接口:

基本绘图接口

  • drawLine(int x1, int y1, int x2, int y2):绘制直线。
  • drawRect(int x, int y, int width, int height):绘制矩形。
  • drawEllipse(int x, int y, int width, int height):绘制椭圆。
  • drawText(int x, int y, const QString &text):绘制文本。
  • drawPixmap(int x, int y, const QPixmap &pixmap):绘制图像。
  • *drawPoints(const QPointF points, int pointCount)**:绘制多个点。
  • *drawPolyline(const QPointF points, int pointCount)**:绘制折线。
  • *drawPolygon(const QPointF points, int pointCount, Qt::FillRule fillRule = Qt::OddEvenFill)**:绘制多边形。

画笔与画刷设置

  • setPen(const QPen &pen):设置画笔,指定绘制线条时的颜色、样式和宽度。
  • setBrush(const QBrush &brush):设置画刷,指定填充几何图形时的颜色或纹理。

变换操作

  • translate(qreal dx, qreal dy):平移坐标系。
  • scale(qreal sx, qreal sy):缩放坐标系。
  • rotate(qreal angle):旋转坐标系。
  • shear(qreal sh, qreal sv):对坐标系执行扭曲。

渲染提示

  • setRenderHint(QPainter::RenderHint hint, bool on = true):设置渲染提示,如抗锯齿、文本抗锯齿等,以优化绘制效果。

裁剪功能

  • setClipRect(const QRectF &rectangle, Qt::ClipOperation operation = Qt::ReplaceClip):启用剪辑,并使用给定的剪辑操作将剪辑区域设置为给定的矩形。
  • setClipPath(const QPainterPath &path, Qt::ClipOperation operation = Qt::ReplaceClip):设置裁剪路径。

其他常用接口

  • boundingRect(const QRectF &rectangle, int flags, const QString &text):返回使用当前设置的字体在给定矩形内部绘制时显示的文本的边界矩形。
  • drawPicture(const QPointF &point, const QPicture &picture):在指定位置绘制一个QPicture。
  • drawImage(const QRectF &targetRect, const QImage &image, const QRectF &sourceRect, Qt::ImageConversionFlags flags = Qt::AutoColor):绘制图像,其中targetRect表示目标矩形区域,sourceRect表示源图像要绘制的区域。

使用示例

以下是一个简单的使用QPainter绘制图形和文本的示例:


void Widget::paintEvent(QPaintEvent* event) {  
    QPainter painter(this);  
  
    // 设置画笔颜色  
    painter.setPen(QColor(0, 160, 230));  
  
    // 设置字体  
    QFont font;  
    font.setFamily("Microsoft YaHei");  
    font.setPointSize(50);  
    font.setItalic(true);  
    painter.setFont(font);  
  
    // 绘制文本  
    painter.drawText(rect(), Qt::AlignCenter, "Qt");  
  
    // 设置画刷颜色  
    painter.setBrush(QColor(255, 160, 90));  
  
    // 绘制矩形  
    painter.drawRect(50, 50, 160, 100);  
  
    // 设置画笔宽度  
    painter.setPen(QPen(QColor(0, 160, 230), 2));  
  
    // 绘制椭圆  
    painter.drawEllipse(250, 50, 160, 100);  
}

在上面的示例中,我们首先创建了一个QPainter对象,然后设置了画笔颜色、字体和画刷颜色,接着分别绘制了文本、矩形和椭圆。这些操作都使用了QPainter提供的常用接口。

总的来说,QPainter提供了丰富的接口和功能,可以满足各种复杂的图形绘制需求。开发者可以根据需要选择合适的接口进行绘图操作。

4.QPainter构成 

QPainter是Qt框架中的一个核心类,它用于在窗口和其他绘制设备上执行低级绘制操作。QPainter与QPaintDevice和QPaintEngine类一起构成了Qt绘图系统的基础。以下是QPainter构成的主要方面:

1. QPainter类

  • 功能:QPainter类提供了高度优化的功能来完成大多数图形用户界面程序所需的工作。它能画出从简单线条到复杂形状如饼图和弦等一切图形,还可以绘制对齐的文本和像素图。
  • 操作对象:QPainter可以对继承QPaintDevice类的任何对象进行操作。QPaintDevice表示可以使用QPainter绘制的设备,如QWidget、QPixmap、QImage等。
  • 核心功能:绘图。QPainter提供了丰富的API来绘制基本图形、文本、图像等,并支持各种变换(如平移、旋转、缩放)和渲染提示(如抗锯齿)。

2. QPaintDevice类

  • 功能:QPaintDevice是一个二维空间的抽象,这个二维空间可以由QPainter在上面进行绘制。它是QPainter绘图的目的地,相当于画布。
  • 子类:QPaintDevice有多个子类,包括QWidget、QPixmap、QImage等。这些子类为QPainter提供了一个具体的“画布”,使其能够在上面进行绘制。

3. QPaintEngine类

  • 功能:QPaintEngine提供了一个接口,QPainter使用这个接口来绘制不同类型的设备。它是QPainter和QPaintDevice之间的桥梁,负责实际的绘制操作。
  • 内部使用:QPaintEngine类由QPainter和QPaintDevice内部使用,应用程序一般无需直接与之打交道,除非要创建自己的设备类型。

4. 相互关系

  • QPainter与QPaintDevice:QPainter在QPaintDevice上进行绘制操作。在绘图之前,需要创建一个QPainter对象,并将其与QPaintDevice关联起来。
  • QPainter与QPaintEngine:QPainter通过QPaintEngine在QPaintDevice上进行绘制。QPaintEngine负责处理具体的绘制细节,如将绘制命令转换为设备可理解的格式。

5. 绘图流程

  • 创建QPainter对象:通常是在窗口的绘制事件(如paintEvent)中创建QPainter对象,并将其与当前窗口(或其他QPaintDevice子类)关联起来。
  • 设置绘图属性:使用QPainter提供的接口设置绘图属性,如画笔(QPen)、画刷(QBrush)、字体(QFont)等。
  • 执行绘制操作:调用QPainter的绘制函数(如drawLine、drawRect、drawText等)在QPaintDevice上进行绘制。
  • 结束绘制:绘制完成后,通常不需要显式调用结束绘制的函数,因为QPainter的析构函数会自动处理。但在某些情况下,可能需要手动调用QPainter的end()函数来确保资源被正确释放。

6. 渲染质量与优化

  • 渲染提示:QPainter提供了多种渲染提示(如抗锯齿、文本抗锯齿等),可以通过setRenderHint函数来启用这些提示以优化绘制效果。
  • 状态保存与恢复:QPainter内部有一个状态堆栈,可以通过save()和restore()函数来保存和恢复QPainter的状态。这在进行复杂绘制操作时非常有用,可以避免状态混乱。

综上所述,QPainter、QPaintDevice和QPaintEngine共同构成了Qt绘图系统的基础。QPainter负责执行绘制操作,QPaintDevice提供绘制的目的地(画布),而QPaintEngine则负责实际的绘制实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值