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();
}
相关推荐
LONGZETECH4 分钟前
无人机组装调试实训高损耗痛点分析与虚拟仿真教学落地方案
c语言·开发语言·架构·无人机
luj_176830 分钟前
大航海时代:沉浸式财商实战沙盒
c语言·开发语言·网络·经验分享·算法
赵广陆1 小时前
企业实战:Markdown图片检索
android·java·开发语言
C++、Java和Python的菜鸟1 小时前
第3章 从0开始用若依
java·开发语言
夜雪一千1 小时前
Python 如何实现 SHA 加密?SHA1 / SHA256 / SHA512 实战教程
开发语言·python
有点。2 小时前
C++二叉树(一)
开发语言·数据结构·c++
民乐团扒谱机2 小时前
【微实验】谐波乘积谱(HPS)算法深度解析:原理、数学与代码实现
开发语言·人工智能·python·算法·语音识别·音乐
秋田君2 小时前
QT_网络编程体系
网络·arm开发·qt
报错小能手2 小时前
Go 语言结构 基础语法
开发语言·后端·golang
Lazionr2 小时前
stack与queue:底层实现与容器适配器
开发语言·数据结构·c++