文章详情
QT美美的窗口侧边栏tab设计封装类
Posted on 2023-02-13 12:33:30 by 主打一个C++
感觉:
直接上代码:
#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