Qt自定义控件

第1章 绘制矩形

cpp 复制代码
void CWidget::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event)

    /*创建一支画笔,并且指定当前对象为画布*/
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing, true);

    /*创建一个矩形*/
    QRect rect(0, 0, 100, 50);

    painter.save();
    painter.translate(this->rect().center());
    painter.rotate(135);
    painter.setPen(QPen(Qt::green, 2));
    painter.setBrush(Qt::red);
    painter.drawRect(rect);
    painter.restore();

    painter.save();
    painter.translate(this->rect().center() + QPoint(-35, -35));
    painter.rotate(135 + 45);
    painter.setPen(QPen(Qt::green, 2));
    painter.setBrush(Qt::red);
    painter.drawRect(rect);
    painter.restore();

    painter.save();
    painter.translate(this->rect().center() + QPoint(-35, -35) + QPoint(-0, -50));
    painter.rotate(135 + 45 + 45);
    painter.setPen(QPen(Qt::green, 2));
    painter.setBrush(Qt::red);
    painter.drawRect(rect);
    painter.restore();
}

第2章 裁剪路径

设置裁剪路径。

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

cpp 复制代码
void CWidget::paintEvent(QPaintEvent *event)
{
    auto rect = event->rect();
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing,true);
    painter.setBrush(Qt::cyan);

    /*指定路径*/
    QPainterPath path;

    /*
     * rect.adjusted(20, 30, -20, -30);
     *      原始矩形做一下调整
     *      rect.adjusted(左, 上, 右, 下);
     *      左边界向右移动20(左边内缩)
     *      上边界向下移动30(上边内缩)
     *      右边界向左移动-20(右边内缩)
     *      下边界向上移动30(下边内缩)
     *  80表示:宽度方向上的圆角高度为80;
     *  60表示:高度方向上的圆角高度为60;
     */
    path.addRoundRect(rect.adjusted(20, 30, -20, -30), 80, 60);

    /*沿着路径做裁剪*/
    painter.setClipPath(path);

    /*裁剪好了开始绘制矩形*/
    painter.drawRect(rect);
}

第3章 裁剪矩形

设置裁剪矩形。

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

cpp 复制代码
void CWidget::paintEvent(QPaintEvent *event)
{
    auto rect = event->rect();

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

    /*裁剪出一个区域绘制一条直线*/
    painter.save();
    painter.setPen(QPen(Qt::magenta, 20));
    painter.setBrush(Qt::cyan);
    QRect adjustedRect = rect.adjusted(20, 20, -20, -20);                   /*调整一下矩形*/
    painter.setClipRect(adjustedRect);                                      /*裁剪出这个矩形来*/
    painter.drawLine(adjustedRect.topLeft(), adjustedRect.bottomRight());   /*在裁剪出的矩形中绘制直线*/
    painter.restore();

    /*给未裁剪的区域绘制一个矩形框*/
    painter.save();
    painter.setPen(QPen(Qt::red, 20));
    painter.drawRect(rect);
    painter.restore();

}

第4章 裁剪区域

第5章 绘制多边形

void drawConvexPolygon(const QPolygonF &polygon)

cpp 复制代码
void CWidget::paintEvent(QPaintEvent *event)
{
    auto rect = event->rect();

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

    /*绘制一个四边形*/
    painter.save();
    painter.setPen(QPen(Qt::cyan, 2));
    painter.setBrush(Qt::cyan);
    QPolygonF polygonF;
    polygonF.append(QPointF(rect.width() / 2.0, 0.0));
    polygonF.append(QPointF(rect.width(), rect.height() / 2.0));
    polygonF.append(QPointF(rect.width() / 2.0, rect.height()));
    polygonF.append(QPointF(0, rect.height() / 2.0));
    painter.drawPolygon(polygonF);
    painter.restore();

    /*绘制一个三角形*/
    painter.save();
    painter.setPen(QPen(Qt::red, 2));
    painter.setBrush(Qt::red);
    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);
    painter.restore();
}

第6章 绘制折线

void drawPolyline(const QPolygonF &points)

cpp 复制代码
void CWidget::paintEvent(QPaintEvent *event)
{
    auto rect = event->rect();
    Q_UNUSED(rect)

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

    /*绘制具有4条边的折线*/
    painter.save();
    painter.setPen(QPen(Qt::cyan, 5));
    painter.setBrush(Qt::magenta);
    QPolygonF polygonF;
    polygonF.append(QPoint(22,33));
    polygonF.append(QPoint(78,45));
    polygonF.append(QPoint(111,233));
    polygonF.append(QPoint(234,88));
    polygonF.append(QPoint(34,89));
    painter.drawPolyline(polygonF);
    painter.restore();
}

第7章 绘制弧形

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

cpp 复制代码
CWidget::CWidget(QWidget *parent)
    : QWidget(parent)
{
    setWindowTitle("Qt 绘制五角星");

    this->resize(600, 600);

    qDebug() << "当前对象的宽度:" << this->width() ;
    qDebug() << "当前对象的高度:" << this->height() ;
}

CWidget::~CWidget() = default;

void CWidget::paintEvent(QPaintEvent *event)
{
    auto rect = event->rect();
    Q_UNUSED(rect)

    qDebug() << "当前矩形的宽度:" << rect.width();
    qDebug() << "当前矩形的高度:" << rect.height() ;

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

    /*绘制弧形*/
    painter.save();
    painter.setPen(QPen(Qt::red, 5));
    painter.setBrush(Qt::magenta);
    QRectF adjustedRect = rect.adjusted(20, 20, -20, -20);
    int startAngle = 30 * 16;
    int lenAngle = 240 * 16;
    painter.drawArc(adjustedRect, startAngle, lenAngle);
    painter.restore();

    /*绘制虚线矩形*/
    painter.save();
    painter.setPen(QPen(Qt::blue, 3, Qt::DotLine));
    painter.drawRect(adjustedRect);
    painter.restore();
}

当前对象的宽度: 600

当前对象的高度: 600

当前矩形的宽度: 600

当前矩形的高度: 600

第8章 绘制弦

painter.drawChord(adjustedRect, startAngle, lenAngle);

cpp 复制代码
void CWidget::paintEvent(QPaintEvent *event)
{
    auto rect = event->rect();
    Q_UNUSED(rect)

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

    /*绘制弦*/
    painter.save();
    painter.setPen(QPen(Qt::red, 5));
    painter.setBrush(Qt::NoBrush);
    QRectF adjustedRect = rect.adjusted(20, 20, -20, -20);
    int startAngle = 30 * 16;
    int lenAngle = 120 * 16;
    painter.drawChord(adjustedRect, startAngle, lenAngle);
    painter.restore();

    /*绘制虚线矩形*/
    painter.save();
    painter.setPen(QPen(Qt::blue, 3, Qt::DotLine));
    painter.drawRect(adjustedRect);
    painter.restore();
}

第9章 绘制扇形

painter.drawPie(adjustedRect, startAngle, lenAngle);

cpp 复制代码
void CWidget::paintEvent(QPaintEvent *event)
{
    auto rect = event->rect();
    Q_UNUSED(rect)

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

    /*绘制扇形*/
    painter.save();
    painter.setPen(QPen(Qt::red, 5));
    painter.setBrush(Qt::NoBrush);
    QRectF adjustedRect = rect.adjusted(20, 20, -20, -20);
    int startAngle = 30 * 16;
    int lenAngle = 150 * 16;
    painter.drawPie(adjustedRect, startAngle, lenAngle);
    painter.restore();

    /*绘制虚线矩形*/
    painter.save();
    painter.setPen(QPen(Qt::blue, 3, Qt::DotLine));
    painter.drawRect(adjustedRect);
    painter.restore();
}
相关推荐
charlie11451419118 小时前
通用GUI编程技术——图形渲染实战(四十)——深度缓冲与3D变换:从平面到立体
开发语言·c++·平面·3d·图形渲染·win32
小张同学82418 小时前
-RAG检索增强生成让智能体拥有企业级专属知识库
开发语言·python·架构·pycharm
DevilSeagull18 小时前
Rust 枚举(enum)深度解析:从定义到 Option 的安全之道
开发语言·后端·安全·rust·github
Ulyanov18 小时前
《现代 Python 桌面应用架构实战:PySide6 + QML 从入门到工程化》:实时时钟与数据驱动 UI —— 从“事件回调”到“状态绑定”的范式跃迁
开发语言·python·qt·ui·架构·交互
AI进化营-智能译站18 小时前
ROS2 C++开发系列06:变量、数据类型与IO实战
java·开发语言·c++·ai
阿里嘎多学长1 天前
2026-04-30 GitHub 热点项目精选
开发语言·程序员·github·代码托管
叶小鸡1 天前
Java 篇-项目实战-苍穹外卖-笔记汇总
java·开发语言·笔记
AI人工智能+电脑小能手1 天前
【大白话说Java面试题】【Java基础篇】第22题:HashMap 和 HashSet 有哪些区别
java·开发语言·哈希算法·散列表·hash
时空系1 天前
第10篇:继承扩展——面向对象编程进阶 python中文编程
开发语言·python·ai编程
CHANG_THE_WORLD1 天前
python 批量终止进程exe
开发语言·python