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();
}
相关推荐
郑州光合科技余经理8 小时前
海外版外卖加盟:总站与分站配送规则怎么分开管
java·开发语言·前端·后端·uni-app·php·ai编程
2601_962071578 小时前
类变量和全局变量的生命周期有什么区别?
java·开发语言·jvm
Wang's Blog9 小时前
Java 项目实战: 外卖平台优化-前后端分离开发模式与工程拆分
java·开发语言
Dovis(誓平步青云)9 小时前
浇水提醒刚弹出又消失,植物状态别只存一个百分比
开发语言·前端·javascript·pdf·ecmascript·电脑
sunshine22 girl10 小时前
Java学习六 Java常见API-2--String-3-字符串的截取替换和其他方法
java·开发语言·学习
LOVE️YOU10 小时前
Python 函数名、函数对象与“把函数作为参数传递”
开发语言·python
sunshine22 girl10 小时前
Java学习六 Java常见API-1-Radom随机数
java·开发语言·学习
可乐鸡翅yeah_10 小时前
hls.js 手动自定义 http 请求 loader,修改请求头实战
开发语言·前端·javascript·网络协议·http·ecmascript·m3u8在线
潼心1412o11 小时前
C++初阶(长期更新)第6讲:类和对象(下)
开发语言·c++·算法
夜晚回家11 小时前
Python 零基础入门 | 输入的数字为什么不能直接算
开发语言·python