自定义按键组件:用于管理分类窗体

自定义按键组件

自定义动画按键导航控件
参考网上大神绘制的自定义按键组件思路,自己重新整理一份代码,方便学习管理,源码全部开放,不喜勿喷!谢谢。
目前实现顶端与左端布局,当作控件使用,布局即可。
#ifndef BUTTONGROUP_H
#define BUTTONGROUP_H

//
// 按键组件:用于管理分类窗体
//

#include <QWidget>
#include <QBoxLayout>
#include <QPaintEvent>

class QBoxLayout;
class QPushButton;
class QButtonGroup;
class QAbstractButton;
class QPropertyAnimation;

class ButtonGroup : public QWidget {
        Q_OBJECT
    public:
        ButtonGroup(QWidget *parent = NULL);
        ~ButtonGroup();

        enum LinePosition {
            LinePosition_Left = 0,     //左边
            LinePosition_Right = 1,    //右边
            LinePosition_Top = 2,      //上边
            LinePosition_Bottom = 3    //下边
        };

        // 设置按键尺寸
        void setButtonSize(QSize buttonSize);

        // 设置布局模式
        void setLayoutMode(QBoxLayout::Direction mode);

        // 添加按键
        void addButtonItem(QAbstractButton *button, int id, bool isEnd = false);

        // 设置动画时间间隔
        void setInterval(int interval) {
            _interval = interval;
        }

        // 设置基准颜色
        void setBaseColor(const QColor &color) {
            _baseColor = color;
        }

        // 设置线颜色
        void setLineColor(const QColor &color) {
            _lineColor = color;
        }

        // 设置线条
        void setLineWeight(int lineWeight) {
            _lineWeight = lineWeight;
        }

        // 设置方向
        void setLinePosition(LinePosition linePosition) {
            _linePosition = linePosition;
        }

    protected:
        // 大小改变事件
        void resizeEvent(QResizeEvent *e);

        // 绘图事件
        void paintEvent(QPaintEvent *e);

    private slots:
        // 响应按键点击事件
        void _onButtonClicked(int id);

        // 响应动画参数值改变
        void _onValueChange(QVariant _currentIndex);

    private:
        // 初始化动画
        void _initAnimation();

    private:
        int _offset;                     // 偏移量
        int _lineWeight;                 // 线条的长度
        int _interval;                   // 线条移动的速度
        int _currentIndex;               // 当前索引
        LinePosition _linePosition;      // 线条方向

        QSize _btnSize;                  // 按钮的尺寸
        QColor _textColor;               // 文字颜色
        QColor _baseColor;               // 基准颜色
        QColor _lineColor;               // 线条的颜色
        QColor _hoverColor;              // 按钮经过颜色
        QBoxLayout::Direction _mode;     // 布局模式

        QBoxLayout *_layout;             // 布局
        QButtonGroup *_btnGroup;         // 按钮组
        QPropertyAnimation *_animation;  // 属性动画
};

#endif // BUTTONGROUP_H
#include <QPainter>
#include <QBoxLayout>
#include <QPushButton>
#include <QButtonGroup>
#include <QAbstractButton>
#include <QPropertyAnimation>

#include "ButtonGroup.h"


// 构造函数

ButtonGroup::ButtonGroup(QWidget *parent)
    : QWidget(parent)
    , _offset(4)
    , _lineWeight(4)
    , _interval(200)
    , _currentIndex(0)
    , _linePosition(LinePosition_Top)
    , _btnSize(QSize(80, 32))
    , _textColor(QColor(Qt::black))
    , _baseColor(QColor(Qt::white))
    , _lineColor(QColor(23,160,134))
    , _hoverColor(QColor(87,184,166).light(150))
    , _mode(QBoxLayout::RightToLeft)
    , _layout(new QBoxLayout(_mode))
    , _btnGroup(new QButtonGroup(this))
    , _animation(new QPropertyAnimation(this, ""))
{
    _initAnimation();
    connect(_btnGroup, SIGNAL(buttonClicked(int)),
            this, SLOT(_onButtonClicked(int)));
}


//

ButtonGroup::~ButtonGroup() {

}


// 设置按键尺寸

void ButtonGroup::setButtonSize(QSize buttonSize) {
    if (NULL == _btnGroup) {
        return;
    }

    foreach(QAbstractButton *button, _btnGroup->buttons()) {
        if (NULL == button) {
            continue;
        }
        button->setFixedSize(buttonSize);
    }

    _btnSize = buttonSize;
}


// 设置布局模式

void ButtonGroup::setLayoutMode(QBoxLayout::Direction mode) {
    if (NULL == _layout) {
        return;
    }

    _layout->setDirection(mode);
    _layout->setMargin(4);
    _layout->setSpacing(0);
}


// 添加按键控件

void ButtonGroup::addButtonItem(QAbstractButton *button, int id, bool isEnd) {
    if (NULL == button) {
        return;
    }

    QString back = QString("QPushButton{background-color:rgba(%1, %2, %3, 80);border:none;}")
            .arg(_baseColor.red()).arg(_baseColor.green()).arg(_baseColor.blue());
    QString hover = QString("QPushButton:hover{background-color:rgba(%1, %2, %3, 40);}")
            .arg(_hoverColor.red()).arg(_hoverColor.green()).arg(_hoverColor.blue());
    QString check = QString("QPushButton:pressed, QPushButton:checked{background-color:rgba(%1, %2, %3, 80);}")
            .arg(_lineColor.red()).arg(_lineColor.green()).arg(_lineColor.blue());

    QString style = QString("%1%2%3").arg(back).arg(hover).arg(check);
    button->setStyleSheet(style);

    _layout->addWidget(button);
    if (isEnd) {
        _layout->addStretch(0);
        setLayout(_layout);
    }

    _btnGroup->addButton(button, id);
}


//

void ButtonGroup::resizeEvent(QResizeEvent *e) {
    QWidget::resizeEvent(e);
}


// 绘图

void ButtonGroup::paintEvent(QPaintEvent *e) {
    QWidget::paintEvent(e);

    //根据不同的位置绘制线条区域,也可以改成绘制两点之间的距离
    int xPos = 0;
    int yPos = 0;
    int width = 0;
    int height = 0;

    switch (_linePosition) {
        case LinePosition_Top:
            xPos = _offset;
            yPos = 0;
            width = _btnSize.width();
            height = _lineWeight;
            break;
        case LinePosition_Bottom:
            xPos = _offset;
            yPos = this->height() - _lineWeight;
            width = _btnSize.width();
            height = _lineWeight;
            break;
        case LinePosition_Left:
            xPos = 0;
            yPos = _offset;
            width = _lineWeight;
            height = _btnSize.height();
            break;
        case LinePosition_Right:
            xPos = this->width() - _lineWeight;
            yPos = _offset;
            width = _lineWeight;
            height = _btnSize.height();
            break;
        default:
            break;
    }

    QPainter painter(this);
    painter.setRenderHints(QPainter::Antialiasing);

    //设置颜色
    painter.setPen(Qt::NoPen);
    painter.setBrush(_lineColor);
    painter.drawRect(xPos, yPos, width, height);
}


// 响应按键事件

void ButtonGroup::_onButtonClicked(int id) {
    if ((NULL == _btnGroup)
            || (NULL == _animation))
    {
        return;
    }

    _btnGroup->button(id)->setCheckable(true);
    _btnGroup->button(id)->setChecked(true);

    int offset = _currentIndex * _btnSize.width() + 4;
    int endOffset = id * _btnSize.width() + 4;

    if (_linePosition < LinePosition_Top) {
        offset = _currentIndex * _btnSize.height() + 4;
        endOffset = id * _btnSize.height() + 4;
    }

    _animation->setStartValue(offset);
    _animation->setEndValue(endOffset);
    _animation->start();

    _currentIndex = id;
}


// 响应动画参数值改变

void ButtonGroup::_onValueChange(QVariant index) {
    _offset = index.toInt();
    update();
}


// 初始化动画

void ButtonGroup::_initAnimation() {
    if (NULL == _animation) {
        return;
    }

    _animation->setDuration(_interval);
    connect(_animation, SIGNAL(valueChanged(QVariant)),
            this, SLOT(_onValueChange(QVariant)));
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值