qt中继承pushbutton自定义控件设置按钮样式

提要

继承QPushButton后的按钮,设置其样式。

实现

在自定义的控件类中添加Q_OBJECT宏
在自定义的控件的类中重写paintevent函数
自定义的控件在使用时,必须指明其父对象
使用样式表设置样式,将类名改为自定义的类名

例子

直接上代码
myButton.h

#ifndef MYBUTTON_H
#define MYBUTTON_H

#include <QWidget>
#include <QPushButton>


class myButton : public QPushButton
{
    Q_OBJECT
public:
    myButton(int index,QWidget *parent = nullptr);
    ~myButton();

    int getIndex();//获取按钮的下标
    void setSceneBtnId(int &id);//设置场景按钮的id
    void setSceneBtnName(QString &name);//设置场景按钮的名字
    void setSceneBtnNameId(int id,QString name);//设置场景按钮id

    int getSceneBtnId();//获取场景按钮id
    QString getScenBtnName();//获取场景按钮的名称

    void initBtnStyle();//设置按钮样式
    void getAdjustScreenRatio();//获取屏幕分辨率
public slots:
    void slot_setSceneBtnName(QString strName);//设置场景按钮的名称
    void slot_setSceneBtnId(int id);//设置场景按钮id
protected:
    void paintEvent(QPaintEvent *e);
    void mousePressEvent(QMouseEvent *e);
private:
    int m_index;//按钮的下标,用于区别点击的是哪个按钮
    int          m_id;//按钮的id
    QString      m_strName;//按钮的名称
};
#endif // MYBUTTON_H

myButton.cpp

#include "mybutton.h"
//#include "screenresolution.h"
#include <QMouseEvent>
#include <QStyleOption>
#include <QBitmap>
#include <QPixmap>
#include <QPainter>

myButton::myButton(int index,QWidget *parent)
:QPushButton(parent),m_index(index)
{
    initBtnStyle();
}

myButton::~myButton()
{

}

int myButton::getIndex()
{
    return m_index;
}

void myButton::setSceneBtnId(int &id)
{
    m_id = id;
}

void myButton::setSceneBtnName(QString &name)
{
    m_strName = name;
}

void myButton::setSceneBtnNameId(int id, QString name)
{
    m_id = id;
    m_strName = name;
}

int myButton::getSceneBtnId()
{
    return m_id;
}

QString myButton::getScenBtnName()
{
    return m_strName;
}


void myButton::getAdjustScreenRatio()
{

}

void myButton::initBtnStyle()
{
    QPixmap pixmap;
    QBitmap bit;
    pixmap.load(":/new/prefix1/images/sceneBtn.png");
    pixmap = pixmap.scaled(QSize(181 ,74),Qt::KeepAspectRatio);
    setFixedSize(pixmap.size());
    bit = pixmap.mask();
    setMask(bit);

    this->setStyleSheet("myButton{background-color:transparent;"
                           "border-image: url(:/new/prefix1/images/sceneBtn.png);"
                           "border: 1px solid #0D79FF;opacity: 0.7;"
                           "font-size: 18px;font-family: Microsoft YaHei;"
                           "font-weight: 400;color: #FFFFFF;}"
                           "myButton:pressed{border-image: url(:/new/prefix1/images/sysbtnPressed.png);"
                           "font-size: 18px;font-family: Microsoft YaHei;"
                           "font-weight: 400;color: rgba(255, 255, 255, 0.8);line-height: 18px;}"
                           );
}

void myButton::slot_setSceneBtnName(QString strName)
{
    m_strName = strName;
}

void myButton::slot_setSceneBtnId(int id)
{
    m_id = id;
}

void myButton::paintEvent(QPaintEvent *e)
{
    Q_UNUSED(e);

    QStyleOption opt;
    opt.init(this);
    QPainter p(this);
    style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);

    QPushButton::paintEvent(e);
}

void myButton::mousePressEvent(QMouseEvent *e)
{
    if(e->button() == Qt::RightButton)
    {
        //创建编辑框,若已经创建则直接显示,绑定编辑框与按钮来存储修改的信息
    }
    QPushButton::mousePressEvent(e);
}

以上就是自定义控件的类,其使用如下,附上关键代码:

    myButton *btn = new myButton(0, this);//指出父类
    btn->setText("自定义类");
    btn->setGeometry(0,0,200,200);

以上就是自定义控件样式的设置。由于我重写鼠标点击事件的时候,忘记了父类的鼠标点击事件导致事件没有传递下去,从而没有出现点击后的效果,纠结了许久,终得解决。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

肩上风骋

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

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

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

打赏作者

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

抵扣说明:

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

余额充值