L o a d i n g . . .
主打一个C++
文章详情

QT美美的窗口侧边栏tab设计封装类

Posted on 2023-02-13 12:33:30 by 主打一个C++

感觉:

image.png

直接上代码:

#ifndef QLEFTTAB_H
#define QLEFTTAB_H
#include <QPushButton>
#include <QIcon>
#include <QPainter>
#include <QGroupBox>
#include <QObject>
#include <QVector>
class Widget;
typedef void(Widget::* CLICK_CALLBACK)(bool _click,int _index);
class QLeftTab;
typedef void(QLeftTab::* PClickCallBack)(bool, int);
class Tab_Button : public QPushButton {
    Q_OBJECT
public:
    Tab_Button(QWidget *parent,int _index,const QString &text, const QIcon &defaultIcon, const QIcon &pressedIcon) : QPushButton(parent) {
        this->m_index = _index;
        //qDebug() << m_index;
        //setAttribute(Qt::WA_TranslucentBackground);

        connect(this, &QPushButton::pressed, this, &Tab_Button::onPressed);
        connect(this, &QPushButton::released, this, &Tab_Button::onReleased);
        this->setCursor(QCursor(Qt::PointingHandCursor));
        this->setText(text);
        this->setIcon(defaultIcon);
        this->pressedIcon = pressedIcon;
        this->defaultIcon = defaultIcon;
        this->setIconSize(QSize(22, 22));
        m_btnDefaultStyle=QString("QPushButton{"
                                         "border: 0px solid black;"
                                         "border-radius: 10%;"
                                         "padding-left: 10px;"
                                         "text-align: left;"
                                         "font-size:13px;"
                                        "background: transparent;"
                                         "}"
                                         "QPushButton::hover{"
                                         "background-color: #353535"
                                         "}");
        m_btnPressedStyle=QString("QPushButton{"
                                    "border: 0px solid black;"
                                    "border-radius: 10%;"
                                    "padding-left: 10px;"
                                    "text-align: left;"
                                    "font-size:13px;"
                                    "background: transparent;"
                                    "background-color: #353535"
                                    "}")
            ;
        this->setStyleSheet(m_btnDefaultStyle);
    }
public:
    void SetCallBack(QLeftTab* _pLeftTab, PClickCallBack _pCallBack){
        m_pLeftTab=_pLeftTab;
        m_callPress =_pCallBack;
    }
//tabs回调通知
    void CallPressed(){
        this->setIcon(pressedIcon);
        this->setStyleSheet(m_btnPressedStyle);
    }
    void CallReleased(){
        this->setIcon(defaultIcon);
        this->setStyleSheet(m_btnDefaultStyle);
    }
private slots:
    void onPressed() {
        (m_pLeftTab->*m_callPress)(true, this->m_index);
    }

    void onReleased() {
        (m_pLeftTab->*m_callPress)(false, this->m_index);
    }

private:
    int m_index = -1;
    QLeftTab* m_pLeftTab;
    PClickCallBack m_callPress;
    QIcon defaultIcon;
    QIcon pressedIcon;
    QString m_btnDefaultStyle,m_btnPressedStyle;
};

class QLeftTab:public QObject {
    Q_OBJECT
public:
    QLeftTab(){
        m_DarkTheme="QGroupBox{"
                      "border: 0px solid black;"
                      "background-color: #292929"
                      "}";
    };
    ~QLeftTab(){
    };
private:
    void ClickCallBack(bool _click, int _index) {
        if(_click){
            //qDebug() << "CallPress:"<<_index;

            m_btnArr[m_LastIndex]->CallReleased();
            m_LastIndex = _index;
            m_btnArr[m_LastIndex]->CallPressed();
        }

        if(m_userCallBack!= nullptr){
            (m_widget->*m_userCallBack)(_click,_index);
        }
    }
public:
    void Init(QWidget *parent, QGroupBox* _pGroupBox,CLICK_CALLBACK _clickCallBack){
        m_widget = (Widget*)parent;
        m_groupBox = _pGroupBox;
        m_userCallBack = _clickCallBack;
        this->SetTabStyle(this->m_DarkTheme);
    }
    Tab_Button* Add(const QString &text, const QIcon &defaultIcon, const QIcon &pressedIcon){
        Tab_Button*btn = new Tab_Button((QWidget*)m_widget,m_count," " + text,defaultIcon,pressedIcon);
        btn->setGeometry(this->m_groupBox->x() + this->m_btnGap.left, this->m_topStartPos + (this->m_count++ * (this->m_btnGap.top + this->m_btnHeight)), this->m_groupBox->width() - this->m_btnGap.right, this->m_btnHeight);
        //btn->setMinimumSize(200, 20);
        m_btnArr.append(btn);
        btn->SetCallBack(this, &QLeftTab::ClickCallBack);
        btn->show();
        return btn;
    }
    void SetTabStyle(const QString& _style){
        this->m_groupBox->setStyleSheet(_style);
    }
    void SetTabTop(int _startTop){
        this->m_topStartPos = _startTop;
    }
    bool CallTabIndex(int _index){
        if(_index > (int)m_btnArr.size()){
            return false;
        }
        m_LastIndex = _index;
        m_btnArr[m_LastIndex]->CallPressed();
        return true;
    }
// private:
//     void Switch_Btn(int _index, bool _clicked = true){
//         // 迭代开关
//         for (auto it = m_btnArr.begin(); it != m_btnArr.end(); ++it) {
//             qDebug() << *it;
//         }
//     }
private:
    Widget * m_widget = nullptr;
    QGroupBox* m_groupBox = nullptr;
private:
    int m_LastIndex = 0;
    QVector<Tab_Button*> m_btnArr;
    CLICK_CALLBACK m_userCallBack = nullptr;
    int m_count = 0;
    int m_btnHeight = 35;
    int m_topStartPos=0;
    struct{int left=15,top = 12,right=25, bottom = 0;}m_btnGap;

    //主题
    QString m_DarkTheme,m_BrightTheme;
};
#endif // QLEFTTAB_H

调用:

    //左侧tab菜单
    m_leftTabs.Init(this, ui->groupBox_leftTabs,&Widget::TabClickCallBack);
    m_leftTabs.SetTabTop(60);

    m_leftTabs.Add("远程协助", QIcon(":/icon/leftTabBtn/1.png"), QIcon(":/icon/leftTabBtn/1_click.png"));
    m_leftTabs.Add("设备列表", QIcon(":/icon/leftTabBtn/2.png"), QIcon(":/icon/leftTabBtn/2_click.png"));
    m_leftTabs.Add("手机投屏", QIcon(":/icon/leftTabBtn/3.png"), QIcon(":/icon/leftTabBtn/3_click.png"));
    m_leftTabs.Add("程序设定", QIcon(":/icon/leftTabBtn/4.png"), QIcon(":/icon/leftTabBtn/4_click.png"));
    m_leftTabs.CallTabIndex(0);//首选远程协助

随便封装了一下~~~~~

谁有优化更好的,麻烦发出来 复制一下~~~~

*转载请注明出处:原文链接:https://cpp.vin/page/89.html

作者近期文章
  • 随手笔记
  • 主打一个C++   2025-01-11 20:02:01
  • 都2000000025年了。还有不能随意访问guthub的,仔细看。在国内其实是可以正常访问的,gfw并没屏蔽。这里给出其中一个简单直接的方法稳定访问。1. 随便百度一个”dn
提示
×
确定
数据库执行: 8次 总耗时: 0.01s
页面加载耗时: 



wechat +447752296473
wechat cpp-blog