Qt自定义控件13:继承QPushButton自绘按钮

Qt自定义控件13:继承QPushButton自绘按钮

先看效果图:在这里插入图片描述

思路:新建类继承QPushButton,重写paintEvent方法,根据需求画出界面。(效果图是通过拖的QPushButton控件,然后提升为我的自定义类进行操作)

关键代码:

CMButton::CMButton(QWidget *parent) :QPushButton(parent)
{
    setCheckable(true);
    QFontMetrics fontMetrics(font());
    int nFontWidth = fontMetrics.width(this->text());
    this->setMinimumWidth(nFontWidth+this->iconSize().width()+iconStartX);
    textStartX = iconSize().width()+iconStartX;
}

void CMButton::paintEvent(QPaintEvent *event){
    //绘制准备工作,启用反锯齿
    QPainter painter(this);
    painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);

    drawBg(&painter);
    drawText(&painter);
    drawIcon(&painter);
    drawTri(&painter);
    drawLine(&painter);
}

void CMButton::drawBg(QPainter* painter){
    int width = this->width();
    int height = this->height();
    painter->save();
    if(isChecked()){
        painter->setBrush(checkBgColor);
    }else if(isHovered){
        painter->setBrush(hoverBgColor);
    }else{
        painter->setBrush(normalBgColor);
    }
    QRect rect(0,0,width,height);
    painter->setPen(Qt::NoPen);
    painter->drawRect(rect);
    painter->restore();
}

void CMButton::drawText(QPainter *painter){
    painter->save();
    QRect rect(textStartX,0,this->width(),this->height());
    if(isChecked()){
        painter->setPen(checkTextColor);
    }else if(isHovered){
        painter->setPen(hoverTextColor);
    }else{
        painter->setPen(normalTextColor);
    }

    QFont font = painter->font();
//    font.setPixelSize(10);
    painter->setFont(font);
    painter->drawText(rect,Qt::AlignCenter,text());
    painter->restore();
}

void CMButton::drawIcon(QPainter *painter){
    painter->save();
    QRect rect(iconStartX,(this->height()-this->iconSize().height())/2,this->iconSize().width(),this->iconSize().height());
    QPixmap pixmap = this->icon().pixmap(this->iconSize());
    painter->drawPixmap(rect,pixmap);
    painter->restore();
}

void CMButton::drawTri(QPainter *painter){
    painter->save();

    painter->restore();
}

void CMButton::drawLine(QPainter *painter){
    painter->save();
    if(isChecked() || isHovered){
        QRect rect(0,0,5,this->height());
        painter->setPen(Qt::NoPen);
        painter->setBrush(lineColor);
        painter->drawRect(rect);
    }

    painter->restore();
}

void CMButton::enterEvent(QEvent *)
{
    isHovered = true;
    update();
}

void CMButton::leaveEvent(QEvent *)
{
    isHovered = false;
    update();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

制造垃圾代码的垃圾coder一个

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值