【无标题】QT自定义控件

该代码示例展示了如何在Qt中处理QPaintEvent,使用QPainter进行图形绘制。包括设置抗锯齿效果,定义画笔样式如线宽、线型、颜色和渐变,以及画刷样式如线性渐变、角度渐变和圆形渐变。同时,还包含了文本的绘制,调整字体、大小及位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

绘画事件


void Dot::paintEvent(QPaintEvent *event)
{
    //
    QPainter painter(this);
    painter.setRenderHint(QPainter::RenderHint::Antialiasing, true);//抗锯齿

    setPenStyle(painter);
    setBrushStyle(painter);
}

画笔设置


/**
 * @brief Dot::setPenStyle
 * @param painter
 */
void Dot::setPenStyle(QPainter &painter)
{
    int penWidth = 3;
    QColor penColor = QColor(0,0,255);
    //画笔
    QPen pen;
    pen.setColor(penColor);//颜色
    pen.setWidth(penWidth);//线宽
    pen.setStyle(Qt::PenStyle::DashDotDotLine);//线型
    pen.setCapStyle(Qt::PenCapStyle::RoundCap);//笔帽样式(圆形)
    pen.setJoinStyle(Qt::PenJoinStyle::RoundJoin);//笔连接的样式(圆形)
    pen.setMiterLimit(3);//斜接连接可以从连接点延伸多长
    //pen.setDashOffset(30);//设置虚线偏移量,虚线绘制偏移的距离
    //pen.setCosmetic(true);//设置为化妆品
//    QVector<qreal> pattern;
//    pattern.append(1);
//    pattern.append(20);
//    pattern.append(5);
//    pattern.append(20);
//    pen.setDashPattern(pattern);//设置虚线长度和空隙长度,数量必须是偶数

    painter.setPen(pen);
}

/**
 * @brief Dot::setBrushStyle
 * @param painter
 */
void Dot::setBrushStyle(QPainter &painter)
{
    qreal hrefWidth = this->geometry().width()/2;
    qreal hrefHeight = this->geometry().height()/2;
    qreal radio = qMin(hrefWidth, hrefHeight) - painter.pen().width();
    QColor fullColor = QColor(80, 80, 255);
    //画刷
    //线性渐变
    QLinearGradient lineGradient(hrefWidth, hrefHeight- radio, hrefWidth, hrefHeight + radio);
    lineGradient.setColorAt(0, QColor(255, 255, 255));
    lineGradient.setColorAt(1, fullColor);

    //角度渐变
    QConicalGradient conicalGradient(hrefWidth, hrefHeight, 0);
    conicalGradient.setColorAt(0, fullColor);
    conicalGradient.setColorAt(1, QColor(255, 255, 255));

    //圆形渐变
    QRadialGradient radiaGradient(hrefWidth, hrefHeight, radio, this->geometry().width()/3, this->geometry().height()/3, radio/10);
    radiaGradient.setColorAt(0, fullColor);
    radiaGradient.setColorAt(1, QColor(255, 255, 255));

    QBrush brush(lineGradient);
    //brush.setColor(fullColor);//填充颜色
    brush.setStyle(Qt::BrushStyle::LinearGradientPattern);//填充样式(线性渐变)
    //brush.setMatrix(QMatrix());
    //brush.setTexture(QPixmap(":/image/image/logo.png"));//画笔像素图为像素图,样式为Qt::TexturePattern
    //brush.setTextureImage(QImage(":/image/image/logo.png"));//画笔像素图为像素图,样式为Qt::TexturePattern
    //brush.setTransform(QTransform());
    painter.setBrush(brush);
}

画文本


/**
 * @brief Dot::drawText
 * @param painter
 */
void Dot::drawText(QPainter &painter)
{
    painter.setPen(QPen(QColor(255,255,0)));
    painter.setBrush(Qt::BrushStyle::NoBrush);

    QFont font = QFont("宋体", 22);
    QFontMetricsF metrics(font);
    QString str = "30%";
    qreal fontWidth = metrics.width(str);
    qreal fontHeight = metrics.height();

    //画字体
    painter.save();//保存之前的操作

    QTransform trans;
    trans.translate(this->geometry().width()/2,this->geometry().height()*0.8);//移动坐标原点
    //trans.rotate(45);//根据坐标原点旋转
    //trans.scale(1.5, 1.5);//缩放
    painter.setTransform(trans);

    painter.setFont(font);
    painter.drawRect(-(fontWidth/2),-(fontHeight/2), fontWidth, fontHeight);
    painter.drawText(-(fontWidth/2),-(fontHeight/2), fontWidth, fontHeight, Qt::AlignCenter, str);

    painter.restore();//恢复
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值