QT之重绘QPushButton

要做的最终效果:

->

其实想做的简单一点,就是两个图片来回切换,效果其实差不多的。

由于用的地方比较多,就做一个重绘,统一管理资源,就不会乱啦~

cSwitchBtn.h
#ifndef CSWITCHBTN_H
#define CSWITCHBTN_H

#include 

class CSwitchBtn : public QPushButton
{
    Q_OBJECT
public:
    explicit CSwitchBtn(bool bState, QWidget *parent = nullptr);

signals:
    void clicked(bool bRes);
public slots:
    void click(bool bRes);
private:
    bool m_bRes;
    void SetCurSheet(bool bState);
public:
    //设置和获取选中状态
    bool GetCurState();
    void SetCurState(bool bState);
protected:
    void mouseReleaseEvent(QMouseEvent *event);
};

#endif // CSWITCHBTN_H

cSwitchBtn.cpp

#include "cSwitchBtn.h"

CSwitchBtn::CSwitchBtn(bool bState, QWidget *parent) : QPushButton(parent)
{
    m_bRes = bState;
    //设置btn样式
    setFixedHeight(24);
    setFixedWidth(41);
    SetCurSheet(m_bRes);
    //信号槽
    connect(this, SIGNAL(clicked(bool)), this, SLOT(click(bool)));

}

void CSwitchBtn::SetCurSheet(bool bState)
{
    if (m_bRes)
    {
        setStyleSheet("background-image: url(:/开关-开.png);border:1px;border-radius:5px;");
    }
    else
    {
        setStyleSheet("background-image: url(:/开关-关.png);border:1px;border-radius:5px;");
    }
    raise();
}

void CSwitchBtn::click(bool bRes)
{
    m_bRes = !m_bRes;
    SetCurSheet(m_bRes);
}

bool CSwitchBtn::GetCurState()
{
    return m_bRes;
}

void CSwitchBtn::SetCurState(bool bState)
{
    m_bRes = bState;
    SetCurSheet(m_bRes);
}

void CSwitchBtn::mouseReleaseEvent(QMouseEvent *event)
{
    emit clicked(m_bRes);
    QPushButton::mouseReleaseEvent(event);
}

使用:


    CSwitchBtn* m_pbtn = new CSwitchBtn(false, this);

    //m_pbtn.SetCurState(true);
    m_pbtn.move(160,120);
    m_pbtn.show();

呐呐呐~酱紫就完啦~

如果是作为一般的成员变量,用的时候记得在初始化列表的时候酱紫,不然会报错,自己都找不到原因的错:


cClass::cClass(QWidget *parent) :
    CBaseDlg(parent),
    ui(new Ui::CVolume),
//酱紫哦!!!
    m_btn(false, this)
{
    ……
}

 

你可能感兴趣的:(qt)