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();
}
相关推荐
用户805533698034 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner4 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz9 天前
QML Hello World 入门示例
qt
xcyxiner12 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner13 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner13 天前
DicomViewer (添加模型类)3
qt
xcyxiner14 天前
DicomViewer (目录调整) 2
qt
xcyxiner14 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
LDR00616 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术16 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript