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();
}
相关推荐
Ricky_Theseus2 小时前
C++静态库
开发语言·c++
SuperEugene2 小时前
Python 异步 async/await:为什么 AI 框架大量使用?| 基础篇
开发语言·人工智能·python
SMF19192 小时前
【uv】Python包管理器uv安装和应用
开发语言·python·uv
Lyyaoo.2 小时前
【JAVA基础面经】String、StringBuffer、StringBuilder
java·开发语言
蓝色的杯子2 小时前
Python面试30分钟突击掌握-LeetCode1-Array
开发语言·python·面试
Kiri霧2 小时前
Kotlin递归
android·开发语言·kotlin
范纹杉想快点毕业2 小时前
Zynq开发视角下的C语言能力分级详解
c语言·开发语言
常利兵2 小时前
Kotlin抽象类与接口:相爱相杀的编程“CP”
android·开发语言·kotlin
2501_944448472 小时前
数据可视化 Kotlin KMP OpenHarmony图表生成
开发语言·信息可视化·harmonyos