1.qt c++ 二维绘图的类都有什么

在 Qt C++ 中,二维绘图主要通过 Qt 的 2D 图形绘制系统(Qt Painting System) 实现。该系统提供了一套丰富的类用于在窗口、图像或打印机等设备上进行 2D 绘图。以下是常用的与二维绘图相关的核心类:


🎨 核心绘图类

  1. QPainter

    • 作用:执行所有绘图操作的核心类。
    • 用法:通常在 QWidget::paintEvent()QGraphicsItem::paint() 或直接在 QImage/QPixmap/QPrinter 上创建 QPainter 对象进行绘制。
    • 可绘制内容:线条、矩形、椭圆、文本、图像、路径、渐变等。
  2. QPaintDevice

    • 作用:所有可以被 QPainter 绘制的目标设备的基类。
    • 常见子类
      • QWidget:在窗口部件上绘图。
      • QImage:在内存中的图像上绘图(支持像素级访问)。
      • QPixmap:在屏幕优化的图像上绘图(适合显示,不适合像素操作)。
      • QPicture:记录并重放绘图命令。
      • QPrinter:向打印机输出。
  3. QPaintEngine

    • 作用:抽象底层图形 API(如 OpenGL、Direct2D、Raster 等),一般用户无需直接使用。

🖌️ 辅助绘图类(用于设置样式、形状等)

  1. QPen

    • 定义线条的颜色、宽度、线型(实线、虚线等)、端点样式、连接样式等。
  2. QBrush

    • 定义填充样式,如纯色、渐变(QGradient)、纹理(QPixmap)等。
  3. QColor

    • 表示颜色,支持 RGB、HSV、CMYK 等多种格式。
  4. QFont

    • 控制文本的字体、大小、粗细等。
  5. QTransform / QMatrix

    • 提供坐标变换功能(平移、旋转、缩放、仿射变换等)。
  6. QRect / QRectF / QPoint / QPointF / QSize / QSizeF

    • 基础几何类型,用于表示位置、尺寸、区域等(带 F 后缀的是浮点版本)。
  7. QPolygon / QPolygonF

    • 表示点序列构成的多边形。
  8. QRegion

    • 表示一个区域(常用于裁剪或不规则窗口)。
  9. QPainterPath

    • 描述复杂路径(如贝塞尔曲线、组合形状),可重复使用或进行布尔运算。
  10. QGradient(及其子类)

    • 渐变填充基类,包括:
      • QLinearGradient
      • QRadialGradient
      • QConicalGradient

🖼️ 高级绘图框架(可选)

  1. QGraphicsView 框架(基于场景的 2D 绘图)
    • QGraphicsScene:管理大量 2D 图元。
    • QGraphicsView:视口,用于查看场景。
    • QGraphicsItem:场景中的基本图元(如 QGraphicsRectItem, QGraphicsEllipseItem, 自定义 item 等)。
    • 适合复杂交互式 2D 图形应用(如流程图、地图、游戏等)。

✅ 典型使用模式

void MyWidget::paintEvent(QPaintEvent *event) {
    QPainter painter(this); // 在 QWidget 上绘图
    painter.setPen(Qt::red);
    painter.setBrush(Qt::blue);
    painter.drawRect(10, 10, 100, 50);
}

或在 QImage 上绘图:

QImage image(200, 200, QImage::Format_ARGB32);
image.fill(Qt::white);
QPainter painter(&image);
painter.drawLine(...);

总结

功能
绘图执行 QPainter
绘图目标 QWidget, QImage, QPixmap, QPrinter
样式控制 QPen, QBrush, QColor, QFont
几何与路径 QRect, QPoint, QPainterPath, QPolygon
变换 QTransform
渐变 QLinearGradient
场景系统 QGraphicsView / QGraphicsScene

如果你有具体应用场景(比如画图表、做图像处理、做 UI 自定义控件等),我可以给出更针对性的建议。

2.QPainter 详解

QPainter 是 Qt 框架中用于 2D 图形绘制的核心类,广泛应用于自定义控件、图表、图像处理等场景。它提供了丰富的 API,支持在各种设备(如窗口、图像、打印机等)上进行高质量的绘图操作。


一、基本概念

1. 绘图设备(Paint Device)

QPainter 只能在一个 绘图设备 上进行绘制,常见的绘图设备包括:

  • QWidget:在窗口或控件上绘制。
  • QImage:在内存图像上绘制,可用于图像生成或处理。
  • QPixmap:与屏幕相关的像素图,适合显示。
  • QPicture:记录绘图命令,可重放。
  • QPrinter:用于打印输出。

2. 绘图状态(Paint State)

QPainter 内部维护一个状态栈,包括:

  • 画笔(QPen):线条颜色、宽度、样式等。
  • 画刷(QBrush):填充颜色、图案等。
  • 字体(QFont):文本字体。
  • 变换矩阵(Transform):平移、旋转、缩放等。
  • 裁剪区域(Clipping):限制绘制区域。

可通过 save()restore() 保存/恢复状态。


二、基本使用流程

void MyWidget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this); // 在 this (QWidget) 上绘图

    // 设置画笔和画刷
    painter.setPen(Qt::red);
    painter.setBrush(Qt::blue);

    // 绘制图形
    painter.drawRect(10, 10, 100, 50);
    painter.drawEllipse(120, 10, 80, 80);

    // 绘制文本
    painter.setFont(QFont("Arial", 12));
    painter.drawText(10, 100, "Hello QPainter!");

    // 自动析构时结束绘制
}

⚠️ 注意:通常只在 paintEvent() 中创建 QPainter,否则可能导致异常或闪烁。


三、常用绘图方法

方法 功能
drawLine() 画线
drawRect() / drawRoundedRect() 矩形 / 圆角矩形
drawEllipse() 椭圆或圆
drawPolygon() / drawPolyline() 多边形 / 折线
drawPath() 使用 QPainterPath 绘制复杂路径
drawText() 绘制文本
drawPixmap() / drawImage() 绘制图像
fillRect() 填充矩形(不使用当前画笔)

四、设置绘图属性

1. 画笔(QPen)

控制线条外观:

QPen pen;
pen.setColor(Qt::green);
pen.setWidth(3);
pen.setStyle(Qt::DashLine);
painter.setPen(pen);

2. 画刷(QBrush)

控制填充样式:

QBrush brush(Qt::yellow, Qt::BDiagPattern);
painter.setBrush(brush);

3. 字体(QFont)

painter.setFont(QFont("微软雅黑", 14, QFont::Bold));

五、坐标系统与变换

QPainter 支持仿射变换:

painter.translate(100, 100);   // 平移
painter.rotate(45);            // 旋转(角度)
painter.scale(1.5, 1.5);       // 缩放
painter.shear(0.2, 0);         // 剪切

变换是累积的,建议配合 save() / restore() 使用。


六、抗锯齿(Antialiasing)

提升绘制质量:

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

其他常用渲染提示:

  • QPainter::TextAntialiasing
  • QPainter::SmoothPixmapTransform

七、离屏绘制(Off-screen Rendering)

QImageQPixmap 上绘制,再显示到界面:

QImage image(200, 200, QImage::Format_ARGB32);
image.fill(Qt::transparent);

QPainter painter(&image);
painter.setRenderHint(QPainter::Antialiasing);
painter.setBrush(Qt::red);
painter.drawEllipse(10, 10, 180, 180);
painter.end();

// 显示到 QLabel
label->setPixmap(QPixmap::fromImage(image));

八、性能建议

  • 避免在 paintEvent 外频繁创建 QPainter
  • 尽量减少重绘区域(使用 update(rect) 而非 repaint())。
  • 对于复杂图形,考虑缓存为 QPixmap(双缓冲)。
  • 合理使用 QPainterPath 预编译路径。

九、完整示例:自定义圆形按钮

class CircleButton : public QWidget {
protected:
    void paintEvent(QPaintEvent *) override {
        QPainter painter(this);
        painter.setRenderHint(QPainter::Antialiasing);

        QColor color = underMouse() ? Qt::darkCyan : Qt::cyan;
        painter.setBrush(color);
        painter.setPen(Qt::black);
        painter.drawEllipse(rect());
        painter.drawText(rect(), Qt::AlignCenter, "Click");
    }

    void enterEvent(QEvent *) override { update(); }
    void leaveEvent(QEvent *) override { update(); }
};

十、参考资料


如需了解特定功能(如渐变、路径、合成模式等),可继续提问!

3.QPainter 构成

QPainter 是 Qt 框架中用于 2D 图形绘制的核心类,它提供了丰富的 API 来在各种设备(如窗口、图像、打印机等)上绘制图形、文本和图像。理解 QPainter 的构成可以从以下几个方面入手:


1. 基本组成要素

QPainter 的绘制操作主要依赖于以下三个核心组成部分:

(1) 绘制设备(Paint Device)
  • QPainter 必须作用于一个 绘图设备 上。
  • 常见的绘图设备包括:
    • QWidget(用于在窗口或控件上绘图)
    • QImage(用于离屏绘制,可保存为图片)
    • QPixmap(用于屏幕相关的像素图绘制)
    • QPicture(用于记录和重放绘图命令)
    • QPrinter(用于打印输出)

使用方式:QPainter painter(&device);

(2) 画笔(QPen)
  • 控制 线条的外观:颜色、宽度、线型(实线、虚线等)、端点样式、连接样式等。
  • 示例:
    QPen pen(Qt::red, 2, Qt::DashLine);
    painter.setPen(pen);
    
(3) 画刷(QBrush)
  • 控制 填充区域的外观:颜色、图案(纯色、渐变、纹理等)。
  • 示例:
    QBrush brush(Qt::blue, Qt::BDiagPattern);
    painter.setBrush(brush);
    

注意:如果未设置画刷(或使用 Qt::NoBrush),则图形内部不会被填充。


2. 坐标系统与变换

  • QPainter 支持 坐标变换(平移、旋转、缩放、剪切):
    painter.translate(100, 100);
    painter.rotate(45);
    painter.scale(1.5, 1.5);
    
  • 使用 save()restore() 可以保存和恢复当前的绘制状态(包括变换、pen、brush 等)。

3. 绘制内容类型

QPainter 支持绘制多种图形元素:

类型 方法示例
基本图形 drawLine(), drawRect(), drawEllipse(), drawPolygon()
路径 drawPath(QPainterPath)
文本 drawText()
图像 drawPixmap(), drawImage()
复合图形 通过 QPainterPath 构建复杂形状

4. 绘制状态(State)

QPainter 维护一个内部状态栈,包含:

  • 当前 pen
  • 当前 brush
  • font
  • backgroundMode
  • 坐标变换矩阵(world transform)
  • 裁剪区域(clipping region)

可通过 save() / restore() 进行状态管理。


5. 典型使用流程

void MyWidget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this); // this 是 QWidget 子类
    painter.setPen(Qt::black);
    painter.setBrush(Qt::yellow);
    painter.drawRect(10, 10, 100, 100);
}

注意:通常只在 paintEvent() 中创建 QPainter 并作用于 this(即当前 widget)。


总结

QPainter 的“构成”可以理解为:

  • 绘制目标(Paint Device)
  • 绘制工具(Pen + Brush + Font)
  • 绘制内容(图形、文本、图像)
  • 绘制上下文(坐标变换、裁剪、状态栈)

掌握这些要素,就能灵活使用 QPainter 实现各种 2D 图形界面效果。

如需更深入的内容(如抗锯齿、合成模式、性能优化等),也可以继续提问!

4.QPainter 常用接口

QPainter 是 Qt 中用于 2D 图形绘制的核心类,常用于在窗口、图像(QImage)、打印机(QPrinter)等设备上进行绘图。以下是 QPainter 的一些常用接口和功能分类


一、基本使用流程

QPainter painter(this); // this 通常是 QWidget 指针
// 或者
QPainter painter(&image); // 绘制到 QImage 上

painter.setPen(...);
painter.setBrush(...);
painter.drawXXX(...);

painter.end(); // 可选,析构时自动调用

二、设置绘图属性

1. 画笔(Pen)

控制线条颜色、宽度、样式等。

void setPen(const QPen &pen);
void setPen(Qt::PenStyle style);
void setPen(const QColor &color);

示例:

painter.setPen(QPen(Qt::red, 2, Qt::DashLine));

2. 画刷(Brush)

控制填充颜色和图案(用于封闭图形内部)。

void setBrush(const QBrush &brush);
void setBrush(Qt::BrushStyle style);

示例:

painter.setBrush(QColor(0, 255, 0, 128)); // 半透明绿色

3. 字体(Font)

用于文本绘制。

void setFont(const QFont &font);

三、坐标变换

void translate(const QPointF &offset);     // 平移
void rotate(qreal angle);                 // 旋转(角度,顺时针为正)
void scale(qreal sx, qreal sy);           // 缩放
void shear(qreal sh, qreal sv);           // 剪切
void setTransform(const QTransform &transform, bool combine = false); // 设置仿射变换

注意:变换是累积的,可使用 save() / restore() 保存/恢复状态。


四、状态管理

void save();    // 保存当前状态(包括 pen/brush/transform 等)
void restore(); // 恢复上次 save() 的状态

五、常用绘图函数

1. 基本几何图形

void drawPoint(const QPointF &p);
void drawPoints(const QPointF *points, int pointCount);

void drawLine(const QLineF &line);
void drawLines(const QLineF *lines, int lineCount);

void drawRect(const QRectF &rect);
void drawRects(const QRectF *rects, int rectCount);

void drawEllipse(const QRectF &rect);        // 内接椭圆
void drawEllipse(const QPointF &center, qreal rx, qreal ry);

void drawPolygon(const QPointF *points, int pointCount, Qt::FillRule fillRule = Qt::OddEvenFill);
void drawConvexPolygon(const QPointF *points, int pointCount);

void drawRoundedRect(const QRectF &rect, qreal xRadius, qreal yRadius);

2. 路径(复杂图形)

void drawPath(const QPainterPath &path);

配合 QPainterPath 可绘制贝塞尔曲线、组合图形等。

3. 文本

void drawText(const QPointF &position, const QString &text);
void drawText(const QRectF &rect, int flags, const QString &text); // 支持对齐

4. 图像

void drawPixmap(const QRectF &targetRect, const QPixmap &pixmap, const QRectF &sourceRect);
void drawPixmap(const QPointF &point, const QPixmap &pixmap);
void drawImage(const QRectF &targetRect, const QImage &image, const QRectF &sourceRect);

六、其他实用方法

bool isActive() const;         // 是否处于活动状态(已 begin)
QPaintDevice* device() const;  // 获取当前绘制设备
QRectF viewport() const;       // 视口(设备坐标)
QRectF window() const;         // 窗口(逻辑坐标)
void setRenderHint(RenderHint hint, bool on = true); // 如抗锯齿

常用渲染提示(RenderHint):

  • QPainter::Antialiasing:启用反锯齿(平滑边缘)
  • QPainter::TextAntialiasing:文本抗锯齿
  • QPainter::SmoothPixmapTransform:缩放图片时平滑处理

示例:

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

七、注意事项

  • 只能在 paintEvent() 中或显式创建 QPainter 对象时绘图(如绘制到 QImage)。
  • 不要在构造函数或定时器中直接使用 QPainter 绘制到 widget,应调用 update() 触发重绘。
  • 多次调用 begin() / end() 需配对(通常构造/析构自动处理)。

如果你有具体应用场景(比如画曲线、自定义控件、导出图片等),我可以提供更针对性的示例代码。

5.QPaintDevice详解

QPaintDevice 是 Qt 图形系统中的一个核心抽象基类,用于表示可以被 QPainter 绘制的设备。所有支持绘图操作的 Qt 类(如 QWidget、QImage、QPixmap、QPicture、QOpenGLWidget 等)都继承自 QPaintDevice。理解 QPaintDevice 对于掌握 Qt 的 2D 绘图机制至关重要。


一、基本概念

1. 定义

QPaintDevice 是一个抽象类,不能直接实例化。它定义了绘图设备的基本接口,使得 QPainter 可以在其上进行绘制操作。

2. 核心作用

  • 提供统一的绘图接口。
  • 将绘图操作与底层设备(屏幕、内存图像、打印机等)解耦。
  • 支持跨平台一致的绘图行为。

二、主要子类

子类 说明
QWidget 在窗口部件上绘图(通常在 paintEvent() 中使用)。
QImage 在内存中的图像上绘图,支持像素级访问,可用于离屏渲染。
QPixmap 在屏幕优化的像素图上绘图,适合显示但不支持直接像素读写。
QPicture 记录绘图命令,可重放(序列化绘图操作)。
QPrinter 向打印机输出(通过 QPrinter,本质是 QPaintDevice 的子类)。
QOpenGLPaintDevice 允许使用 QPainter 在 OpenGL 上下文中绘图(Qt5/6 中部分支持)。

注意:QSvgGenerator 在 Qt5 中也继承自 QPaintDevice,用于生成 SVG 文件(Qt6 中可能移除或重构)。


三、关键接口

1. 虚函数(由子类实现)

virtual int devType() const;
virtual QPaintEngine *paintEngine() const = 0;
  • paintEngine():返回与该设备关联的 QPaintEngine 对象,负责实际的底层绘图指令执行。
  • devType():返回设备类型(如 QInternal::WidgetQInternal::Image 等),主要用于内部识别。

2. 公共方法

int width() const;          // 设备逻辑宽度(单位:像素)
int height() const;         // 设备逻辑高度
int widthMM() const;        // 物理宽度(毫米)
int heightMM() const;       // 物理高度(毫米)
int logicalDpiX() const;    // 水平逻辑 DPI
int logicalDpiY() const;    // 垂直逻辑 DPI
qreal devicePixelRatio() const; // 设备像素比(用于高 DPI 屏幕)

这些方法帮助 QPainter 正确缩放和布局内容。


四、使用示例

示例 1:在 QImage 上绘图(离屏渲染)

QImage image(200, 200, QImage::Format_ARGB32);
image.fill(Qt::white);

QPainter painter(&image);
painter.setPen(Qt::red);
painter.drawRect(10, 10, 100, 100);
painter.end();

// 保存或显示 image
image.save("output.png");

示例 2:在 QWidget 中绘图(响应 paintEvent)

void MyWidget::paintEvent(QPaintEvent *event) {
    QPainter painter(this); // this 是 QWidget,继承自 QPaintDevice
    painter.drawLine(0, 0, width(), height());
}

五、注意事项

  1. 线程安全QPaintDevice 及其子类通常不是线程安全的。绘图操作应在 GUI 线程中进行(除非明确支持,如某些 QImage 操作)。
  2. 生命周期:传递给 QPainterQPaintDevice 必须在其整个绘图期间保持有效。
  3. 设备类型限制
    • QImage 支持所有 QPainter 功能。
    • QPixmap 在某些平台上可能不支持高级功能(如浮点坐标抗锯齿)。
    • 打印机设备有分页限制。

六、与 QPaintEngine 的关系

  • QPaintDevice 通过 paintEngine() 返回一个 QPaintEngine 实例。
  • QPaintEngine 是真正的“绘图引擎”,负责将 QPainter 的调用转换为底层 API(如 GDI、Cocoa、X11、OpenGL、Vulkan 等)。
  • 开发者通常不需要直接操作 QPaintEngine,除非要实现自定义绘图后端。

七、Qt6 中的变化

  • QPaintDevice 接口基本保持稳定。
  • 部分子类(如 QGLPixelBuffer)已被废弃。
  • 更强调基于 Vulkan/Metal 的现代图形后端,但 QPainter + QPaintDevice 仍广泛用于 2D UI。

总结

QPaintDevice 是 Qt 2D 绘图体系的基石,它抽象了“在哪里画”的问题,让 QPainter 专注于“怎么画”。掌握其子类特性和使用场景,是高效使用 Qt 进行图形开发的关键。

如需进一步了解,可参考 Qt 官方文档:

是否需要具体某个子类(如 QImage vs QPixmap)的深入对比?

6.QPaintEngine详解

QPaintEngine 是 Qt 绘图系统的核心组成部分之一,它定义了 QPainter 如何在不同的绘图设备上执行绘制操作。QPainter 通过 QPaintEngine 抽象类与具体的绘图设备进行交互。下面是对 QPaintEngine 的详细解析:

1. 基本概念

  • 抽象基类QPaintEngine 是一个抽象基类,提供了统一的接口来支持多种绘图实现(如软件渲染、OpenGL、DirectX等)。
  • 派生类:Qt 提供了多个 QPaintEngine 的具体实现类,例如 QPaintEngineRasterQPaintEngineOpenGL 等,分别对应不同的渲染技术。

2. 主要功能

QPaintEngine 主要负责:

  • QPainter 的绘制命令转换为针对特定设备的底层调用。
  • 处理坐标变换、剪切区域和抗锯齿等高级绘图特性。
  • 支持各种类型的图形绘制(线、矩形、路径等)以及文本绘制。

3. 核心方法

QPaintEngine 定义了一系列虚函数,这些函数对应于 QPainter 可能发出的各种绘制命令。以下是一些关键的方法:

  • begin(QPaintDevice *)end():开始和结束一次绘图会话。
  • drawPath(const QPainterPath &path):绘制一条路径。
  • drawTextItem(const QPointF &position, const QTextItem &textItem):绘制文本项。
  • updateState(const QPaintEngineState &state):当 QPainter 的状态改变时调用。

4. 使用场景

虽然大多数情况下你不需要直接使用 QPaintEngine,因为 QPainter 已经为你封装好了所有细节,但在某些特定情况下,了解 QPaintEngine 对于深入定制绘图过程是有帮助的,比如:

  • 实现自定义绘图设备。
  • 创建新的绘图引擎以支持新硬件或渲染技术。
  • 在特殊情况下优化绘图性能。

5. 注意事项

  • 直接使用 QPaintEngine 需要对 Qt 的绘图系统有较深的理解,并且通常只在开发高级图形应用或需要高度定制化的情况下才考虑这样做。
  • 对于大多数应用程序而言,使用 QPainter 提供的高层API就足够了,无需直接操作 QPaintEngine

总结

QPaintEngine 是 Qt 绘图系统中不可或缺的一部分,它隐藏了不同绘图设备之间的差异,使得开发者可以通过一致的方式进行绘图操作。尽管直接使用 QPaintEngine 的机会不多,理解其工作原理有助于更好地掌握 Qt 的绘图机制,并在必要时实现更高效的图形处理解决方案。

7.QPixmap 详解

QPen 是 Qt 框架中用于定义线条样式和颜色的类。它被广泛应用于绘图操作,如在 QWidgetQImage 或其他 QPaintDevice 子类上绘制直线、矩形、椭圆等形状时指定边框的颜色、宽度、线型(实线、虚线等)和其他属性。以下是关于 QPen 的详细讲解。

一、主要特性

  • 颜色:通过 setColor() 方法设置笔的颜色。
  • 宽度:使用 setWidth() 设置画笔的宽度。默认值为0,表示最细的可能线条(通常是一个像素宽)。
  • 线型:使用 setStyle() 方法设置线条类型,例如实线、虚线等。
  • 帽式样:使用 setCapStyle() 方法设置线条末端的样式,如平头、圆头或方形头。
  • 连接样式:使用 setJoinStyle() 方法设置两条线相交处的连接方式,如斜接连接、圆连接或斜角连接。
  • 自定义虚线模式:通过 setDashPattern() 方法可以创建自定义虚线模式。

二、构造函数

QPen 提供了几种构造函数,允许以不同的方式初始化一个 QPen 对象:

QPen(); // 创建一个默认的黑色实线画笔
QPen(Qt::GlobalColor color); // 根据颜色创建画笔
QPen(const QColor &color); // 根据 QColor 对象创建画笔
QPen(Qt::PenStyle style); // 根据线条风格创建画笔
QPen(const QBrush &brush, qreal width, Qt::PenStyle style = Qt::SolidLine, 
     Qt::PenCapStyle cap = Qt::SquareCap, Qt::PenJoinStyle join = Qt::BevelJoin);
// 使用刷子、宽度、线条风格、帽式样以及连接样式来创建画笔

三、常用方法

  • 设置与获取颜色

    void setColor(const QColor &color);
    QColor color() const;
    
  • 设置与获取宽度

    void setWidth(int width);
    int width() const;
    
  • 设置与获取线条样式

    void setStyle(Qt::PenStyle style);
    Qt::PenStyle style() const;
    

    常见的线条样式包括:

    • Qt::SolidLine: 实线
    • Qt::DashLine: 虚线
    • Qt::DotLine: 点线
    • Qt::DashDotLine: 虚点线
    • Qt::DashDotDotLine: 虚双点线
    • Qt::CustomDashLine: 自定义虚线
  • 设置与获取线条两端的帽式样

    void setCapStyle(Qt::PenCapStyle style);
    Qt::PenCapStyle capStyle() const;
    

    帽式样有三种:

    • Qt::FlatCap: 平头
    • Qt::SquareCap: 方形头
    • Qt::RoundCap: 圆头
  • 设置与获取线条连接样式

    void setJoinStyle(Qt::PenJoinStyle style);
    Qt::PenJoinStyle joinStyle() const;
    

    连接样式包括:

    • Qt::MiterJoin: 斜接连接
    • Qt::BevelJoin: 斜角连接
    • Qt::RoundJoin: 圆连接
  • 设置与获取自定义虚线模式

    void setDashPattern(const QVector<qreal> &pattern);
    QVector<qreal> dashPattern() const;
    

    可以为 Qt::CustomDashLine 风格定义具体的虚线模式,其中 pattern 是一个浮点数数组,每个数字代表线段长度和间隔长度。

四、示例代码

下面是一段简单的代码示例,演示如何使用 QPenQPainter 中绘制不同样式的线条:

QPainter painter(this);
QPen pen;

// 设置颜色为红色,宽度为2像素
pen.setColor(Qt::red);
pen.setWidth(2);

// 设置线条样式为虚线
pen.setStyle(Qt::DashLine);

// 应用到 QPainter
painter.setPen(pen);

// 绘制一条从(10,10)到(100,100)的直线
painter.drawLine(10, 10, 100, 100);

以上是对 QPen 类的基本介绍和使用说明。掌握 QPen 的用法对于实现复杂的图形界面设计至关重要。根据实际需要调整 QPen 的属性,可以使绘制的图形更加丰富多彩。

8.QPainter 成员构成

QPainter 是 Qt 中用于执行 2D 图形绘制的核心类,其功能强大且灵活。它本身并不孤立工作,而是与多个辅助类和成员对象协同完成绘图任务。以下是 QPainter 的主要成员构成(包括其内部状态、使用的工具类以及相关属性):


一、核心绘图工具类(作为 QPainter 的“画具”)

这些类通过 QPainter 的 setter/getter 方法进行设置和获取,共同决定绘制效果:

成员工具 作用说明
QPen 设置线条的样式:颜色、宽度、线型(实线、虚线等)、端点样式、连接样式等。用于绘制图形的轮廓
QBrush 设置填充样式:颜色、图案(纯色、渐变、纹理等)。用于填充封闭图形的内部
QFont 设置文本字体:字号、字族、粗细、斜体等。用于 drawText() 等文本绘制操作。
QTransform / 坐标变换函数 控制坐标系的平移(translate)、旋转(rotate)、缩放(scale)、错切(shear)等。
CompositionMode 设置图像合成模式(如 SourceOver、DestinationIn 等),影响绘制内容如何与背景混合。
RenderHint 设置渲染提示,如 Antialiasing(抗锯齿)、TextAntialiasingSmoothPixmapTransform 等,提升视觉质量。

二、绘图目标设备(QPaintDevice)

QPainter 必须绑定到一个 QPaintDevice 子类实例上才能绘图。常见设备包括:

  • QWidget:在窗口或控件上直接绘制(通常在 paintEvent() 中)。
  • QImage:在内存图像上绘制,支持像素级访问,适合图像处理。
  • QPixmap:在屏幕优化的位图上绘制,适合显示图标、贴图等。
  • QPicture:记录绘图指令,可重放。
  • QOpenGLPaintDevice:在 OpenGL 上下文中绘制(Qt 5/6 支持)。

⚠️ 注意:QPainter 只能在 paintEvent()(对 QWidget)或显式调用 begin()/end() 的上下文中使用。


三、状态管理成员

QPainter 支持保存和恢复当前绘图状态(包括 pen、brush、font、transform 等):

  • save():将当前状态压入栈。
  • restore():从栈中弹出并恢复之前的状态。

这使得临时修改绘图属性后能安全回退,避免状态污染。


四、剪辑(Clipping)控制

限制绘图区域,只在指定区域内绘制:

  • setClipRect()setClipPath()setClipRegion()
  • hasClipping()clipPath() 等用于查询

五、常用绘图方法(成员函数)

虽然不是“构成成员”,但体现了 QPainter 的能力边界:

  • drawLine(), drawRect(), drawEllipse(), drawPolygon()
  • drawPath(QPainterPath) —— 配合 QPainterPath 绘制复杂矢量路径
  • drawText()
  • drawImage(), drawPixmap()
  • fillRect(), fillPath()
  • eraseRect() —— 擦除区域(通常填充背景色)

六、其他重要属性/方法

方法/属性 说明
isActive() 判断是否已调用 begin() 且未调用 end()
device() 返回当前绑定的 QPaintDevice
background() / backgroundMode() 控制背景填充行为(较少用)
opacity() / setOpacity() 设置整体透明度(0.0 ~ 1.0)

总结图示(逻辑结构)

QPainter
├── QPen        → 轮廓样式
├── QBrush      → 填充样式
├── QFont       → 文字样式
├── QTransform  → 坐标变换
├── RenderHints → 渲染质量
├── CompositionMode → 混合模式
├── Clip Region → 裁剪区域
└── QPaintDevice ← 绑定目标(QWidget/QImage等)

这些组成部分共同构成了 QPainter 强大而灵活的 2D 绘图能力,是 Qt 图形界面开发的基础。

9.QPaintDevice成员构成

QPaintDevice 是 Qt 框架中用于表示可以被 QPainter 绘制的设备的抽象基类。它本身不能直接实例化,而是由具体的子类(如 QWidgetQImageQPixmapQPictureQSvgGenerator 等)实现。

一、主要成员构成

虽然 QPaintDevice 是一个抽象类,但它提供了一些关键的公共接口和受保护成员,用于支持绘图系统。以下是其核心组成部分:


1. 纯虚函数(必须由子类实现)
virtual QPaintEngine *paintEngine() const = 0;
  • 返回与该设备关联的 QPaintEngine 对象。
  • QPaintEngine 是 Qt 中实际执行底层绘制操作的引擎(如 raster、OpenGL、PDF 等)。
  • 所有派生类必须实现此函数。

2. 公共成员函数
int devType() const;
int width() const;
int height() const;
int widthMM() const;
int heightMM() const;
int logicalDpiX() const;
int logicalDpiY() const;
qreal devicePixelRatio() const;
qreal devicePixelRatioF() const;
int colorCount() const;
int depth() const;

这些函数提供设备的基本属性信息:

函数 说明
devType() 返回设备类型(如 PdevType::QWidgetPdevType::QImage 等),主要用于内部识别
width() / height() 以像素为单位的设备尺寸
widthMM() / heightMM() 以毫米为单位的物理尺寸(某些设备可能不准确)
logicalDpiX() / logicalDpiY() 逻辑 DPI(每英寸点数)
devicePixelRatio() / devicePixelRatioF() 设备像素比(用于高 DPI 支持,如 Retina 屏)
colorCount() 设备支持的颜色数量(对 QImage 有意义)
depth() 每像素的位数(bit depth)

注意:部分函数在不同子类中的实现可能返回默认值或近似值(例如 QWidget 的 widthMM() 可能不可靠)。


3. 受保护成员(供子类使用)
QPaintDevice();
virtual ~QPaintDevice();
  • 构造函数和析构函数为受保护,防止直接实例化。
  • 子类在构造时会调用基类构造函数。

4. 友元与内部机制
  • QPainterQPaintDevice 的友元类,可以直接访问其内部状态(如是否正在被绘制)。
  • 内部维护一个“被绘制”状态(通过 QPaintDevicePrivate 或类似机制),确保同一时间只有一个 QPainter 在绘制该设备(否则会崩溃或未定义行为)。

二、常见派生类

用途
QWidget 窗口部件,可在其上绘制 GUI
QImage 像素级可读写的图像,支持直接内存访问
QPixmap 屏幕优化的图像,适合显示但不可直接读写像素
QPicture 记录并重放 QPainter 命令
QPrinter 打印输出设备
QSvgGenerator 生成 SVG 矢量图形文件

三、使用示例

QImage image(200, 200, QImage::Format_ARGB32);
QPainter painter(&image);
painter.fillRect(image.rect(), Qt::white);
painter.drawText(10, 20, "Hello, QPaintDevice!");
painter.end();

这里 QImageQPaintDevice 的子类,因此可以作为 QPainter 的绘制目标。


总结

QPaintDevice 的成员构成主要包括:

  • 一个纯虚函数 paintEngine()
  • 一组用于查询设备属性的公共函数;
  • 受保护的构造/析构函数;
  • QPainter 紧密协作的内部状态管理。

它是 Qt 绘图体系的核心抽象,使得不同类型的绘制目标(屏幕、图像、打印机等)可以通过统一的 QPainter 接口进行操作。

10.QBrush 成员构成

QBrush 是 Qt 中用于定义 填充样式(fill pattern)的类,常用于 QPainter 的绘图操作中,比如填充形状、文本背景等。它封装了颜色、纹理、渐变等信息。


一、核心成员构成

1. 构造函数(多种重载)

QBrush();                                      // 默认构造:无刷(NoBrush)
QBrush(Qt::GlobalColor color);                 // 使用预定义颜色
QBrush(const QColor &color, Qt::BrushStyle style = Qt::SolidPattern);
QBrush(Qt::BrushStyle style);                  // 仅指定样式(如 NoBrush、Dense1Pattern 等)
QBrush(const QColor &color, const QPixmap &texture);
QBrush(const QGradient &gradient);
QBrush(const QBrush &other);                   // 拷贝构造

注意:QBrush 支持 颜色图案(pattern)、纹理(pixmap)和 渐变(gradient)四种主要填充方式。


2. 主要公共成员函数

(1)设置/获取颜色
void setColor(const QColor &color);
void setColor(Qt::GlobalColor color);
QColor color() const;
  • 仅在 brush 的类型为 颜色填充(非纹理/渐变)时有效。
  • 若 brush 是纹理或渐变,color() 返回无效颜色(isValid() == false)。
(2)设置/获取样式(图案)
void setStyle(Qt::BrushStyle style);
Qt::BrushStyle style() const;
常见 Qt::BrushStyle 枚举值:
枚举值 说明
Qt::NoBrush 无填充
Qt::SolidPattern 实心填充
Qt::Dense1Pattern ~ Qt::D dense7Pattern 不同密度的点/线图案
Qt::HorPattern, Qt::VerPattern, Qt::CrossPattern 水平、垂直、交叉线
Qt::BDiagPattern, Qt::FDiagPattern, Qt::DiagCrossPattern 斜线图案
Qt::LinearGradientPattern, Qt::RadialGradientPattern, Qt::ConicalGradientPattern 渐变类型(只读,不能直接设置)
Qt::TexturePattern 纹理(基于 QPixmap)

⚠️ 渐变和纹理的 style() 会自动返回对应枚举值,但不能通过 setStyle() 设置渐变或纹理。

(3)设置/获取纹理
void setTexture(const QPixmap &pixmap);
QPixmap texture() const;
  • 设置后,style() 自动变为 Qt::TexturePattern
  • 纹理会平铺填充区域。
(4)设置/获取渐变
void setGradient(const QGradient &gradient);
const QGradient *gradient() const;
  • 支持 QLinearGradientQRadialGradientQConicalGradient
  • 设置后,style() 自动变为对应的渐变类型(如 Qt::LinearGradientPattern)。
  • 返回的是指针,若不是渐变类型则返回 nullptr
(5)查询类型
bool isOpaque() const;        // 是否完全不透明(用于优化绘制)
(6)比较与赋值
bool operator==(const QBrush &b) const;
bool operator!=(const QBrush &b) const;
QBrush &operator=(const QBrush &brush);
(7)其他
QVariant toVariant() const;   // 转为 QVariant(用于属性系统)

3. 内部实现机制(隐式共享)

  • QBrush 使用 隐式共享(Implicit Sharing / Copy-on-Write)。
  • 多个 QBrush 对象可共享同一份数据,直到其中一个被修改。
  • 因此拷贝构造和赋值操作非常高效。

二、使用示例

示例 1:颜色填充

QBrush brush(Qt::red, Qt::SolidPattern);
// 或简写为:
QBrush brush(Qt::red);

示例 2:纹理填充

QPixmap texture(":/images/brick.png");
QBrush brush(texture);

示例 3:线性渐变

QLinearGradient gradient(0, 0, 100, 100);
gradient.setColorAt(0, Qt::white);
gradient.setColorAt(1, Qt::black);
QBrush brush(gradient);

示例 4:在 QPainter 中使用

QPainter painter(this);
painter.setBrush(QBrush(Qt::blue, Qt::Dense4Pattern));
painter.drawRect(10, 10, 100, 100);

三、注意事项

  1. 优先级顺序
    QBrush 内部按以下优先级判断填充内容:
    渐变 > 纹理 > 颜色+样式
    一旦设置了渐变,颜色和样式将被忽略。

  2. 不可变性
    通过 gradient() 返回的是 const QGradient*,不能直接修改;如需修改,应先拷贝。

  3. 性能
    isOpaque() 可用于判断是否可跳过 alpha 混合,提升绘制性能。


四、总结

QBrush 的成员构成主要包括:

类别 成员
构造函数 支持颜色、样式、纹理、渐变等多种初始化方式
属性访问 color(), style(), texture(), gradient()
属性设置 setColor(), setStyle(), setTexture(), setGradient()
工具函数 isOpaque(), operator==, toVariant()
内存管理 隐式共享(高效拷贝)

它是 Qt 绘图系统中控制“如何填充”形状的核心类,与 QPen(控制轮廓)配合使用,共同定义图形外观。

11.QPaintEngine 成员构成

QPaintEngine 是 Qt 框架中用于抽象底层绘图系统的一个核心类。它为 QPainter 提供了与具体平台(如 Windows GDI、macOS Quartz、X11/XCB、OpenGL、SVG 等)无关的统一接口。QPaintEngine 本身是一个抽象基类,具体的绘图功能由其子类实现(如 QRasterPaintEngineQOpenGLPaintEngine 等)。

虽然 QPaint Engine 的完整内部成员在 Qt 的私有实现(qpaintengine_p.h)中定义,但根据 Qt 公开文档和源码结构,其主要公开成员函数关键组成部分如下:


一、主要成员函数(public / virtual)

1. 构造与析构
QPaintEngine(QPaintEngine::Type type);
virtual ~QPaintEngine();
2. 状态与能力查询
QPaintEngine::Type type() const;             // 返回引擎类型(如 Raster、OpenGL 等)
QPaintEngine::PaintEngineFeatures capabilities() const; // 支持的特性(如 Antialiasing、AlphaBlend 等)
bool hasFeature(QPaintEngine::PaintEngineFeature feature) const;
3. 绘图状态管理
virtual bool begin(QPaintDevice *device) = 0; // 开始绘图
virtual bool end() = 0;                       // 结束绘图
QPainter* painter() const;                    // 获取关联的 QPainter
void setPaintDevice(QPaintDevice *device);    // 设置当前设备(protected)
4. 坐标与变换
virtual void updateState(const QPaintEngineState &state); // 更新绘图状态(画笔、画刷、字体、变换等)
5. 基本图元绘制(纯虚函数,由子类实现)
virtual void drawRects(const QRect *, int count);
virtual void drawRects(const QRectF *, int count);
virtual void drawLines(const QLine *, int count);
virtual void drawLines(const QLineF *, int count);
virtual void drawEllipse(const QRectF &);
virtual void drawPath(const QPainterPath &);
virtual void drawPoints(const QPointF *, int pointCount);
virtual void drawPolygon(const QPointF *, int pointCount, PolygonDrawMode mode);
virtual void drawTextItem(const QPointF &p, const QTextItem &textItem);
virtual void drawTiledPixmap(const QRectF &rect, const QPixmap &pixmap, const QPointF &patternOffset);
virtual void drawImage(const QRectF &rectangle, const QImage &image, const QRectF &sr, Qt::ImageConversionFlags flags = Qt::AutoColor);

二、关键数据成员(通常为 protected 或 private)

虽然这些不直接暴露给用户,但在理解其实现时很重要:

  • QPaintDevice *pdev:当前绑定的绘图设备(如 QWidget、QImage 等)。
  • QPainter *activePainter:当前正在使用的 QPainter。
  • QPaintEngineState *state:当前绘图状态(包含 Pen、Brush、Font、Transform、Clip 等)。
  • QPaintEngine::Type engineType:引擎类型(Raster、OpenGL、PostScript 等)。
  • QPaintEngine::PaintEngineFeatures gfxSupport:支持的图形特性位掩码。
  • 各种内部缓存或上下文指针(如 OpenGL 上下文、GDI DC 等,取决于具体子类)。

三、重要枚举

enum Type
QPaintEngine::X11          // X11/XCB
QPaintEngine::Windows      // Windows GDI
QPaintEngine::QuickDraw    // macOS (旧)
QPaintEngine::CoreGraphics // macOS Quartz
QPaintEngine::MacPrinter   // macOS 打印
QPaintEngine::QWindowSystem// 旧式窗口系统
QPaintEngine::PostScript   // PostScript 输出
QPaintEngine::OpenGL       // OpenGL
QPaintEngine::Raster       // 软件光栅化(最常用,如 QImage 绘图)
QPaintEngine::Direct3D     // Direct3D(实验性)
QPaintEngine::Pdf          // PDF 输出
QPaintEngine::Svg          // SVG 输出
QPaintEngine::User         // 用户自定义
enum PaintEngineFeature

表示支持的特性,例如:

  • PrimitiveTransform
  • PatternTransform
  • PixmapTransform
  • LinearGradientFill
  • RadialGradientFill
  • ConicalGradientFill
  • AlphaBlend
  • PorterDuff
  • PerspectiveTransform
  • BlendModes
  • 等等。

四、典型子类

  • QRasterPaintEngine:用于 QImage、QWidget(软件渲染),最常用。
  • QOpenGLPaintEngine:基于 OpenGL 的硬件加速绘图(Qt 5 中已弃用,Qt 6 中移除)。
  • QPdfPaintEngine:生成 PDF 文档。
  • QSvgPaintEngine:生成 SVG 图形。
  • QMacPrintEngine / QWin32PaintEngine:平台特定打印支持。

⚠️ 注意:从 Qt 6 开始QPaintEngine 的许多子类(尤其是 OpenGL 相关)已被移除或重构,Qt 更推荐使用 Qt Quick / Scene Graph 进行现代 GPU 渲染。


总结

QPaintEngine 的“成员构成”主要包括:

  • 类型标识(Type)
  • 能力标志(Features)
  • 状态管理接口(updateState)
  • 图元绘制虚函数(drawXXX)
  • 与 QPainter / QPaintDevice 的绑定机制

它是 Qt 绘图系统的核心抽象层,使得 QPainter 能跨平台、跨后端一致工作。

如需深入,可查阅 Qt 源码中的:

  • src/gui/painting/qpaintengine.h
  • src/gui/painting/qpaintengine_p.h
  • src/gui/painting/qrasterpaintengine.cpp 等实现文件。

是否需要某个具体子类(如 QRasterPaintEngine)的成员结构?

12.QColor

QColor 是 Qt 框架中的一个类,用于表示颜色。它支持多种颜色模型,包括 RGB、HSV 和 CMYK,并且可以使用预定义的颜色名称或通过自定义数值来创建颜色对象。QColor 提供了丰富的方法来操作和转换颜色值。

主要特点

  • 颜色模型:支持 RGB(红绿蓝)、HSV(色调饱和度亮度)、CMYK(青品黄黑)以及灰度模型。
  • 透明度:支持 Alpha 通道,允许设置颜色的透明度。
  • 命名颜色:提供了一系列标准颜色名,如 red, blue, green 等等。
  • 颜色值:可以通过指定各颜色分量的具体数值来创建颜色。

常用方法

创建 QColor 对象
  • 使用颜色名:
    QColor color("red");
    
  • 使用 RGB 值:
    QColor color(255, 0, 0); // 红色
    
  • 使用 RGBA 值:
    QColor color(255, 0, 0, 127); // 半透明红色
    
获取颜色信息
  • 获取红色分量:
    int red = color.red();
    
  • 获取绿色分量:
    int green = color.green();
    
  • 获取蓝色分量:
    int blue = color.blue();
    
  • 获取 Alpha 分量:
    int alpha = color.alpha();
    
颜色转换
  • 转换为 HSV:
    color.toHsv();
    
  • 转换为 CMYK:
    color.toCmyk();
    
其他实用方法
  • 判断颜色是否有效:
    bool isValid = color.isValid();
    
  • 生成当前颜色的淡色调:
    QColor lightColor = color.lighter();
    
  • 生成当前颜色的深色调:
    QColor darkColor = color.darker();
    

QColor 类还提供了许多其他功能,比如颜色插值、比较两个颜色是否相同、获取颜色的名字等。这些特性使得 QColor 成为了处理图形界面中颜色相关问题的强大工具。对于更高级的用途,建议查阅 Qt 官方文档以获得详细的 API 描述和示例代码。

13.QTransform / QMatrix

QTransformQMatrix 是 Qt 框架中用于 2D 图形变换的两个类。它们都用于在绘图(如 QPainter)过程中对坐标系统进行平移(translate)、缩放(scale)、旋转(rotate)和剪切(shear)等操作。不过,这两个类在 Qt 的不同版本中有不同的地位和用途。


📌 QTransform(推荐使用)

  • 引入版本:Qt 4.3 引入,从 Qt 5 开始成为主要的 2D 变换类。

  • 功能:支持完整的仿射变换(affine transformation),甚至可以表示透视变换(虽然 QPainter 不支持非仿射部分)。

  • 矩阵形式:3×3 齐次坐标矩阵:

    [ m11  m12  m13 ]
    [ m21  m22  m23 ]
    [ m31  m32  m33 ]
    

    对于仿射变换,通常 m13 = m23 = 0m31 = m32 = 0m33 = 1,因此实际使用的是前两行的 6 个参数(与 QMatrix 兼容)。

  • 常用方法

    • translate(dx, dy)
    • scale(sx, sy)
    • rotate(angle, axis = Qt::ZAxis)
    • shear(sh, sv)
    • map(QPoint) / map(QRect):坐标变换
    • inverted():求逆变换
    • * 运算符:组合多个变换
  • 示例

    QTransform transform;
    transform.translate(100, 50);
    transform.rotate(45);
    painter.setTransform(transform);
    painter.drawRect(0, 0, 100, 100);
    

📌 QMatrix(已过时)

  • 历史:Qt 早期版本(Qt 3/4)使用的 2D 变换类。

  • 状态在 Qt 5 中被标记为 deprecated(不推荐使用),Qt 6 中已完全移除。

  • 矩阵形式:只支持 2×3 仿射变换(即 6 个参数):

    [ m11  m12  dx ]
    [ m21  m22  dy ]
    

    等价于 QTransform 的简化形式。

  • 与 QTransform 的关系

    • QMatrixQTransform 的子集。
    • QTransform 提供了 toAffine() 方法(Qt 5 中已弃用)可转为 QMatrix。
    • 所有 QMatrix 的功能都可以用 QTransform 完成。
  • 迁移建议:如果你还在使用 QMatrix,应尽快迁移到 QTransform


✅ 总结对比

特性 QTransform QMatrix
Qt 版本支持 Qt 4.3+(Qt 5/6 主力) Qt 3–5(Qt 6 已移除)
是否推荐 ✅ 是 ❌ 否(已废弃)
支持变换类型 仿射 +(理论上)透视 仅仿射
矩阵维度 3×3 2×3(6 参数)
与 QPainter 兼容 ✅(但已过时)

🔧 实用技巧

  • 组合变换顺序很重要!例如先旋转再平移 ≠ 先平移再旋转。
  • 使用 QTransform::reset() 可恢复为单位矩阵。
  • 可通过 QPainter::setTransform() 应用变换,或使用 QPainter::save() / restore() 临时保存/恢复状态。

如需代码示例、坐标映射计算、或如何实现自定义视图变换,请告诉我具体需求!

14.QRect / QRectF / QPoint / QPointF / QSize / QSizeF

这些类是 Qt 框架中用于处理 2D 几何图形的基本数据类型,广泛用于 GUI 编程、绘图、布局管理等场景。它们都定义在 <QRect>, <QPoint>, <QSize> 等头文件中(通常只需包含 <QRect> 即可使用全部相关类型)。

下面是对每个类的简要说明和对比:


1. QPoint

  • 表示一个整数坐标点 (x, y)。
  • 成员:int x(), int y()
  • 常用于像素级定位(如窗口坐标、鼠标位置等)。
  • 示例:
    QPoint p(10, 20);
    int x = p.x(); // 10
    

2. QPointF

  • 表示一个浮点坐标点 (x, y),即 qreal 类型(通常是 double)。
  • 成员:qreal x(), qreal y()
  • 用于需要高精度的场景,如矢量图形、缩放、变换等。
  • 示例:
    QPointF pf(10.5, 20.3);
    

QPointQPointF 可以相互转换:

QPoint p = pf.toPoint();      // 向下取整
QPointF pf2 = p;              // 隐式转换

3. QSize

  • 表示一个整数尺寸 (width, height)。
  • 成员:int width(), int height()
  • 常用于窗口大小、图像尺寸等。
  • 示例:
    QSize s(800, 600);
    

4. QSizeF

  • 表示一个浮点尺寸 (width, height)。
  • 成员:qreal width(), qreal height()
  • 用于高精度或缩放后的尺寸计算。
  • 示例:
    QSizeF sf(800.5, 600.2);
    

QSizeQSizeF 也可相互转换:

QSize s = sf.toSize();   // 截断为整数
QSizeF sf2 = s;

5. QRect

  • 表示一个整数坐标的矩形
  • 由左上角 QPoint(x, y)QSize(width, height) 定义。
  • 或者由 (x, y, width, height) 四个整数定义。
  • 注意:Qt 的矩形坐标系统中,width/height 是包含的像素数,右边界 = x + width - 1。
  • 常用方法:
    • topLeft(), bottomRight()
    • contains(QPoint)
    • intersects(QRect)
    • adjusted(dx1, dy1, dx2, dy2)
  • 示例:
    QRect r(10, 20, 100, 50); // x=10, y=20, w=100, h=50
    

6. QRectF

  • 表示一个浮点坐标的矩形
  • 使用 QPointFQSizeF 构建。
  • 适用于高精度绘图(如 QPainter 在浮点坐标系中绘制)。
  • 示例:
    QRectF rf(10.1, 20.2, 100.5, 50.7);
    

✅ 转换:

QRect r = rf.toRect();    // 取整(floor)
QRectF rf2 = r;           // 隐式提升

使用建议

场景 推荐类型
像素级 UI 布局、窗口坐标 QPoint, QSize, QRect
矢量图形、缩放、旋转、高精度绘图 QPointF, QSizeF, QRectF
QPainter 配合(尤其在 QGraphicsView 中) 优先使用 F 版本

小技巧

  • 所有 F 类型(QPointF 等)支持更精确的仿射变换(如 QTransform)。
  • QPainter::drawRect() 等函数中,可传入 QRectQRectF,后者会启用抗锯齿(若开启)。
  • 判断点是否在矩形内:
    if (rect.contains(point)) { ... }
    

如需代码示例或具体应用场景(如裁剪、碰撞检测、坐标转换等),欢迎继续提问!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐