• 3446阅读
  • 4回复

动态下划线标题栏 [复制链接]

上一主题 下一主题
离线cj123sn
 

图酷模式  只看楼主 倒序阅读 楼主  发表于: 2018-12-28


一直在伸手,惭愧.
代码不多,开发环境 mingw 5.5.1

/*
* .h文件
*/
#include <QWidget>

class QHBoxLayout;
class QLabel;
class QPushButton;
class QPropertyAnimation;

class JSwitchTitle : public QWidget
{
    Q_OBJECT
public:
    explicit JSwitchTitle(QWidget *parent = 0);
    void addTitles(QStringList titles);

signals:

public slots:
    void slotTitleClicked();
private:
    QHBoxLayout* m_pHLayout;
    bool m_bDrawLine = false;
    QRect m_lineNew;
    QRect m_lineOld;
    QLabel* m_pLine;
    QList<QPushButton*> m_btns;
    QPropertyAnimation* m_pLabMv;
};

/*
* cpp文件
*/

#include <QHBoxLayout>
#include <QDebug>
#include <QPropertyAnimation>
#include <QLabel>
#include <QPushButton>

JSwitchTitle::JSwitchTitle(QWidget *parent) : QWidget(parent)
{
    m_pHLayout = new QHBoxLayout(this);
    qDebug()<<"w"<<this->width();
    qDebug()<<"h"<<this->height();
    m_pHLayout->setContentsMargins(20,9,20,9);
    m_pLine = new QLabel(this);
    m_pLine->setStyleSheet("background-color: rgb(55, 174, 254);");
    m_pLine->hide();
    m_pLabMv = new QPropertyAnimation(m_pLine,"geometry");
}

void JSwitchTitle::addTitles(QStringList titles)
{
    foreach(QString title,titles)
    {
        QPushButton* pBtn = new QPushButton(this);
        pBtn->setStyleSheet("QPushButton{color:rgb(68,68,68);font-size:17px;font-family:微软雅黑;border:none}"
                            "QPushButton:hover{color:rgb(40,143,231);}");
        pBtn->setText(title);
        pBtn->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred);
        connect(pBtn,&QPushButton::clicked,this,&JSwitchTitle::slotTitleClicked);
        m_pHLayout->addWidget(pBtn);
        m_btns.append(pBtn);
    }


}

void JSwitchTitle::slotTitleClicked()
{
    QPushButton* pBtn = dynamic_cast<QPushButton*>(sender());

    QPoint labTopLeft = pBtn->geometry().bottomLeft();

    QSize labSize;
    labSize.setWidth(pBtn->width());
    labSize.setHeight(3);

    m_pLabMv->stop();
    if(!m_pLine->isVisible())
    {
        m_pLine->resize(labSize);
        m_pLine->move(labTopLeft);
        m_lineNew = QRect(labTopLeft,labSize);
        m_lineOld = m_lineNew;
        m_pLine->show();
    }
    else
    {
        m_pLabMv->setDuration(500);
        m_lineNew = QRect(labTopLeft,labSize);
        m_pLabMv->setStartValue(m_lineOld);
        m_pLabMv->setEndValue(m_lineNew);
        m_pLabMv->setEasingCurve(QEasingCurve::OutBounce);  // 缓和曲线风格
        m_pLabMv->start();
        m_lineOld = m_lineNew;
    }
}

离线liudianwu

只看该作者 1楼 发表于: 2018-12-28
这不是雨田哥的那个吗?
欢迎关注微信公众号:Qt实战 (各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发)QQ:517216493  WX:feiyangqingyun  QQ群:751439350
离线cj123sn

只看该作者 2楼 发表于: 2018-12-28
回 liudianwu 的帖子
liudianwu:这不是雨田哥的那个吗?[表情]  (2018-12-28 14:44) 

感谢大佬回复
离线qq860930595

只看该作者 3楼 发表于: 2019-01-02
回 cj123sn 的帖子
cj123sn:感谢大佬回复[表情] (2018-12-28 15:01) 

被大佬翻牌了
离线toby520

只看该作者 4楼 发表于: 2019-01-03
QML 做更加酷炫
QtQML多多指教开发社区 http://qtclub.heilqt.com
将QtCoding进行到底
关注移动互联网,关注金融
开发跨平台客户端,服务于金融行业
专业定制界面
群号:312125701   373955953(qml控件定做)
快速回复
限100 字节
 
上一个 下一个