随着用户要求和审美的提升,Qt自带封装完成的按钮已不满足用户的要求,例如开关按钮
,所以需要我们自己封装。
思路:继承已有的QPushButton类,在构造函数中贴上图片,再为控件添加是否打开的属性,用
和打开的图片来回切换。
#ifndef QSWITCHBUTTON_H
#define QSWITCHBUTTON_H
#include <QPushButton>
#include <QWidget>
#include <QLineEdit>
class QSwitchButton : public QPushButton
{
Q_OBJECT
public:
explicit QSwitchButton(QWidget *parent = nullptr);
bool isOpen();
void setOpenState(bool flag);
void setAble(bool flag);
protected:
void mousePressEvent(QMouseEvent *event);
signals:
void click();
private:
bool m_bOpen;
bool m_bIsAble;
};
#endif // QSWITCHBUTTON_H
#include "QSwitchButton.h"
QSwitchButton::QSwitchButton(QWidget *parent) : QPushButton(parent)
{
m_bOpen = false;
m_bIsAble = false;
QPixmap pixmap(":/picture/off.png");
QPixmap fitpixmap = pixmap.scaled(48, 24, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
this->setIcon(QIcon(fitpixmap));
this->setIconSize(QSize(48, 24));
this->setFlat(true);
this->setStyleSheet("border: 0px"); //消除边框
connect(this, &QSwitchButton::click, this, &DigAddsPart::OperatorSwitchBtn);
}
bool QSwitchButton::isOpen()
{
return m_bOpen;
}
void QSwitchButton::setOpenState(bool flag)
{
m_bOpen = flag;
QString image;
if(!m_bOpen)
{
image = ":/picture/off.png";
}
else
{
image = ":/picture/on.png";
}
QPixmap pixmap(image);
QPixmap fitpixmap = pixmap.scaled(48, 24, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
this->setIcon(QIcon(fitpixmap));
}
void QSwitchButton::setAble(bool flag)
{
m_bIsAble = flag;
}
void QSwitchButton::mousePressEvent(QMouseEvent *event)
{
if(m_bIsAble)
{
emit click();
}
}
connect这一步是跟另外一个控件通信,open状态就让另一个控件打开,close状态就让另一个控件关闭。