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();
}

  • 9
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
QT 中,自定义控件的基本步骤如下: 1. 创建一个新的 QT 控件类,继承自 QWidget 或其它 QT 控件类。 2. 在类中添加需要的成员变量和函数,以实现控件的功能。 3. 实现 paintEvent() 函数,用于绘制控件的界面。 4. 实现 resizeEvent() 函数,用于处理控件大小改变时的逻辑。 5. 添加信号和槽函数,以便控件与其它对象进行交互。 6. 将控件添加到布局中或直接放置在窗口中。 下面是一个简单的自定义控件的示例代码: ```C++ class MyCustomWidget : public QWidget { Q_OBJECT public: explicit MyCustomWidget(QWidget *parent = nullptr); protected: void paintEvent(QPaintEvent *event) override; void resizeEvent(QResizeEvent *event) override; signals: void mySignal(); private: int m_value; private slots: void mySlot(); }; MyCustomWidget::MyCustomWidget(QWidget *parent) : QWidget(parent) { m_value = 0; QPushButton *button = new QPushButton("Click me", this); connect(button, &QPushButton::clicked, this, &MyCustomWidget::mySlot); } void MyCustomWidget::paintEvent(QPaintEvent *event) { QPainter painter(this); painter.drawText(rect(), Qt::AlignCenter, QString::number(m_value)); } void MyCustomWidget::resizeEvent(QResizeEvent *event) { // Do something when widget size changes } void MyCustomWidget::mySlot() { m_value++; emit mySignal(); } ``` 这个控件是一个带有一个按钮和一个计数器的简单控件。它继承自 QWidget 类,实现了 paintEvent() 和 resizeEvent() 函数以及一个自定义的信号和槽函数。在构造函数中,我们创建了一个按钮,并将其连接到了 mySlot() 槽函数。在 paintEvent() 函数中,我们使用 QPainter 绘制了一个文本,显示计数器的当前值。最后,我们在 mySlot() 槽函数中增加了计数器的值,并发射了自定义信号 mySignal()。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

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

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

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

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

打赏作者

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

抵扣说明:

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

余额充值