void CBaseConfig::setMenuMaxWidth(int maxw)
ui->widgetSetMenu->setMaximumWidth(maxw);
void CBaseConfig::setMenuBtnSizePolicy(QSizePolicy val)
m_btnQSizePolicy = val;
void CBaseConfig::initMenu(QVector<QPair<QString, QWidget*> >& listItem)
m_btnMap.clear();
m_widgetsMap.clear();
QToolButton *ptbn = NULL;
for (int i = 0; i < listItem.count(); i++)
ptbn = new QToolButton;
ptbn->setObjectName(QString("tbSetMenu%1").arg(i));
ptbn->setText(listItem.at(i).first);
ptbn->setSizePolicy(m_btnQSizePolicy);
ptbn->setCheckable(true);
connect(ptbn, &QToolButton::clicked, this, &CBaseConfig::onToolButtonClicked);
ui->horizontalLayout->addWidget(ptbn);
ui->mainLayout->addWidget(listItem.at(i).second);
listItem.at(i).second->hide();
m_btnMap.push_back(ptbn);
m_widgetsMap[listItem.at(i).first] = listItem.at(i).second;
m_btnMap.at(0)->setChecked(true);
m_bakebtnName = listItem.at(0).first;
listItem.at(0).second->show();
void CBaseConfig::onToolButtonClicked()
QToolButton *b = (QToolButton *)sender();
QString name = b->text();
for ( int i = 0; i < m_btnMap.size(); i++ )
if (m_btnMap.at(i) == b)
m_btnMap.at(i)->setChecked(true);
emit clicked(i, true);
if( m_btnMap.at(i)->isChecked() )
emit clicked(i, false);
m_btnMap.at(i)->setChecked(false);
m_widgetsMap[m_bakebtnName]->hide();
m_widgetsMap[name]->show();
m_bakebtnName = name;
使用代码源文件
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "cbaseconfig.h"
#include <QLabel>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
ui->setupUi(this);
init();
QStringList qss;
qss.append("QToolButton{color:rgb(250, 250,250);font:14px;min-width:72px;min-height:37px;background-color: qlineargradient(spread:pad,x1:0,y1:0,x2:0,y2:1,stop:0 #0931B4,stop:1 #050A51);border:1px;border-right-color: rgb(20, 20, 20);border-left-color: rgb(20, 20, 20);/*border-radius控制圆角大小*/ }");
qss.append("QToolButton:pressed{background-color: qlineargradient(spread:pad,x1:0,y1:0,x2:0,y2:1,stop:0 #0931B4,stop:1 #050A51);}");
qss.append("QToolButton:checked{background-color: qlineargradient(spread:pad,x1:0,y1:0,x2:0,y2:1,stop:0 #420064,stop:1 #0D22DE);}");
this->setStyleSheet(qss.join(""));
MainWindow::~MainWindow()
delete ui;
void MainWindow::init()
int heigth = 76;
CBaseConfig *baseConfig = new CBaseConfig;
baseConfig->setMenuMiniHeight(heigth);
baseConfig->setMenuMaxHeight(heigth);
QVector<QPair<QString, QWidget*> > listItem;
listItem.clear();
QWidget *pWidget;
QGridLayout *playout ;
QLabel *lab;
for (int i = 1; i <= 7; i++)
pWidget = new QWidget;
playout = new QGridLayout;
lab = new QLabel;
lab->setText(QString("菜单%1").arg(i));
lab->setAlignment(Qt::AlignCenter);
lab->setStyleSheet("font: 48px");
playout->addWidget(lab);
pWidget->setLayout(playout);
listItem.push_back(qMakePair(QString("菜单%1").arg(i),pWidget));
connect(baseConfig, &CBaseConfig::clicked, this, [this](int no, bool flag){
if (flag )
qDebug()<<"no: "<<no<<" enter screen.";
qDebug()<<"no: "<<no<<" leave screen.";
baseConfig->initMenu(listItem);
ui->scrollArea->setWidget(baseConfig);
这里每个页面也可以再嵌入菜单;这个只是实现了一个简单的菜单框架,这个菜单可以再改进添加上菜单键的翻页,菜单键太多,就两边加上箭头,用于把隐藏的按键显示出来;还可以把按键改为竖着排放的。
示例代码下载:
码云:gitee.com/fensnote/de…