? Qt 的绘图系统允许使用相同的 API 在屏幕和其它打印设备上进行绘制。整个绘图系统基于 QPainter,QPainterDevice 和 QPaintEngine 三个类。
#include "paintedwidget.h"
#include <QPainter>
#include <QPaintEvent>
PaintedWidget::PaintedWidget(QWidget *parent):QWidget(parent)
{
    setFixedSize(600, 400);
    setWindowTitle("Paint");
}
void PaintedWidget::paintEvent(QPaintEvent *) {
    QPainter painter(this);
    painter.drawLine(80, 100, 650, 500);
    painter.setPen(Qt::red);
    painter.drawRect(10, 10, 100, 400);
    painter.setPen(QPen(Qt::green, 5));
    painter.setBrush(Qt::blue);
    painter.drawEllipse(50, 150, 400, 200);
}

? QPainter 接收一个 QPaintDevice 指针作为参数。QPaintDevice 有很多子类,比如 QImage,以及 QWidget。注意回忆一下,QPaintDevice 可以理解成要在哪里去绘制,而现在我们希望画在这个组件,因此传入的是 this 指针。
#include "paintedwidget.h"
#include <stdio.h>
#include <QPainter>
#include <QPaintEvent>
#include <QMouseEvent>
#include <QWheelEvent>
PaintedWidget::PaintedWidget(QWidget *parent):QWidget(parent)
{
    // setFixedSize(600, 400);
    setWindowTitle("Paint");
}
void PaintedWidget::paintEvent(QPaintEvent *) {
    QPainter *painter = new QPainter(this);
    painter->drawEllipse(x-r/2, y-r/2, r, r);
    delete painter;
}
void PaintedWidget::wheelEvent(QWheelEvent *event) {
    QPoint degree = event->angleDelta();
    if (degree.y() > 0) {
        r++;
    } else {
        r--;
    }
    if (r <= 0) {
        r = 0;
    }
    x = event->position().x();
    y = event->position().y();
    this->update();
}

原文:https://www.cnblogs.com/nsfoxer/p/14391937.html