首页 > 其他分享 >自定义的Qt开关按钮

自定义的Qt开关按钮

时间:2022-11-25 19:46:56浏览次数:44  
标签:rad Qt 自定义 void 按钮 MSwitch event painter opened

这个控件比较简单,模仿现代应用程序常见的开关按钮绘制。通过这个案例你可以了解Qt动画的使用。在VS2015和Qt5.9上简单测试通过。下面是效果图:

下面给出代码,头文件:

class MSwitch : public QWidget
{
    Q_OBJECT

public:
    MSwitch(QWidget* parent = 0);
    QSize sizeHint() const override;
    bool isOpened() const;

signals:
    void clicked(bool);

private:
    void setButtonPos(float where);
    void paintEvent(QPaintEvent *event) override;
    void mousePressEvent(QMouseEvent *event) override;
    void mouseReleaseEvent(QMouseEvent *event) override;
    void enterEvent(QEvent *event) override;
    void leaveEvent(QEvent *event) override;

private:
    bool opened;
    bool hover;
    float atWhere; /* [0, 1] */
    QPoint pressPt;
};

CPP文件(代码中变量atWhere是用来配合绘制动画的):

MSwitch::MSwitch(QWidget* parent) :
    QWidget(parent)
{
    opened = false;
    hover = false;
    atWhere = 0;
}

void MSwitch::setButtonPos(float where)
{
    atWhere = where;
    update();
}

bool MSwitch::isOpened() const
{
    return opened;
}

void MSwitch::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    qreal rad = height() * 0.5; /* 圆半径 */
    int xleft = rad;
    int xright = width() - rad;
    int xpos = xleft + (xright - xleft) * atWhere;
    painter.setPen(Qt::NoPen);
    painter.setBrush((xpos == xright) ? QColor(0, 170, 255) : QColor(173, 173, 173));
    painter.drawRoundedRect(0, 0, width(), height(), rad, rad);
    if (hover) /* 鼠标悬停稍微提亮一点 */
    {
        painter.setBrush(QColor(255, 255, 255, 63));
        painter.drawRoundedRect(0, 0, width(), height(), rad, rad);
    }
    painter.setPen(QColor(213, 213, 213));
    painter.setBrush(QColor(243, 243, 243));
    painter.drawEllipse(QPointF(xpos, rad), rad - 1, rad - 1);
}

void MSwitch::mousePressEvent(QMouseEvent *event)
{
    pressPt = event->pos();
}

void MSwitch::mouseReleaseEvent(QMouseEvent *event)
{
    if (pressPt == event->pos())
    {
        opened = !opened;
        emit clicked(opened);
        QVariantAnimation* ani = new QVariantAnimation(this);
        ani->setStartValue(0.0f);
        ani->setEndValue(1.0f);
        ani->setDuration(200);
        ani->setDirection(opened ? QVariantAnimation::Forward : QVariantAnimation::Backward);
        connect(ani, &QVariantAnimation::valueChanged, this,
            [this](const QVariant& value) { setButtonPos(value.toFloat()); });
        ani->start(QAbstractAnimation::DeleteWhenStopped);
    }
}

void MSwitch::enterEvent(QEvent *event)
{
    hover = true;
    update();
}

void MSwitch::leaveEvent(QEvent *event)
{
    hover = false;
    update();
}

QSize MSwitch::sizeHint() const
{
    return QSize(42, 21);
}

 

标签:rad,Qt,自定义,void,按钮,MSwitch,event,painter,opened
From: https://www.cnblogs.com/mengxiangdu/p/16926176.html

相关文章

  • JPA自定义函数关键字
     SpringBoot从入门到精通(二十七)JPA实现自定义查询,完全不需要写SQL!-阿里云开发者社区(aliyun.com)关 键 字示例方法JPQL语句AndfindByLastnameAnd......
  • 【Android游戏开发二十三】自定义ListView【通用】适配器并实现监听控件!
    ​​ 李华明Himi ​​​原创,转载务必在明显处注明​ ListView:在Android应用开发过程中属于最常用的系统组件之一,当然可能童鞋们问为什么会突然游戏开发中讲这个,呵呵,其......
  • RT-Thread Studio 代码主题配色使用xml自定义
    RT-ThreadStudio代码主题配色自定义RT-ThreadStudio的主题配色是通过其自带的DevStyle插件配置的,其中有Workbenchtheme,Iconcolor,Editortheme,分别控制这Studio......
  • 小程序自定义导航栏
    1.导航栏包括状态栏和标题栏两部分,微信小程序自身的导航栏可以直接用;2.如果需要自定义导航栏"navigationStyle":"custom",只能用微信提供的jsapi获取,uni.getSystemInfo......
  • Qt中的渲染
    Qt中3种不同的渲染方式 1)Qt::AA_UseDesktopOpenGL 使用显卡的openGL库,且要求支持openGL2.1及以上的版本。因此很多老旧设备是不满足版本要求的(windows默认的驱动版本只......
  • 【iOS-cocos2d-X 游戏开发之十二】自定义Cocos2dx摇杆(增强Joystick),增加摇杆跟随用
    本站文章均为​​ 李华明Himi ​​​原创,转载务必在明显处注明对于虚拟摇杆在游戏开发中必不可少,Android方面的是由Himi自己实现封装的,大家可以移步到这里查看详细实现机......
  • QT QMainWindow、QDialog、QWidget之间的区别
    本文转自https://blog.csdn.net/rl529014/article/details/51419126在Qt中,我们将窗口和控件统称为部件(Widget)。窗口是指程序的整体界面,可以包含标题栏、菜单栏、......
  • MQTT入门
    参考文档:http://docs.oasis-open.org/mqtt/mqtt/v5.0/csprd02/mqtt-v5.0-csprd02.htmlhttps://github.com/mcxiaoke/mqtt  摘要MQTT是物联网(IoT)最常用的消息......
  • C++自定义字面量用法(operator"")
    下面举个c++内部的字面量用的例子:unsignedintv1=20U;longv2=30L;unsignedlongv3=40UL;是不是很好奇数字后面U、L、UL。在举个栗子实现字面量方法:在c+......
  • MFC-Button按钮
           ......