欢迎关注公众号可以查看更多完整文章
通过QToolButton来实现侧边栏,或者说侧边工具栏,可以通过接口直接自由添加按钮,可以设置工具按钮对应的QWidget,进而点击不同的按钮可以显示不同的QWidget。
实现代码:
#ifndef QSIDEBAR_H
#define QSIDEBAR_H
#include <QtWidgets/QWidget>
#include <QtWidgets/qtoolbutton.h>
#include <QVBoxLayout>
#include <qmap.h>
#include <qbuttongroup.h>
class QSideBar : public QWidget
{
Q_OBJECT
public:
QSideBar(QWidget *parent = 0);
~QSideBar();
QToolButton* addTooButton(const QString &strName, const QString &strToolTip, const QIcon &icon);
void setToolWidget(QToolButton *pToolBt, QWidget *pWidget);
private:
void showWidget();
QWidget *m_barWidget;
QVBoxLayout *m_barLayout;
QVector<QToolButton*> m_toolBts;
QHBoxLayout *m_parentLayout;
QWidget *m_blankWidget;
QMap<QToolButton *, QWidget *> m_toolWidget;
QToolButton *m_currentToolBt;
QButtonGroup m_buttonGroup;
};
#endif // QSIDEBAR_H
#include "qsidebar.h"
QSideBar::QSideBar(QWidget *parent)
: QWidget(parent), m_currentToolBt(NULL)
{
m_parentLayout = new QHBoxLayout(this);
m_parentLayout->setContentsMargins(0, 0, 0, 0);
m_barWidget = new QWidget(this);
m_barWidget->setFixedWidth(64);
m_barLayout = new QVBoxLayout(m_barWidget);
m_barLayout->setContentsMargins(0, 0, 0, 0);
m_barLayout->setSpacing(0);
m_blankWidget = new QWidget(this);
//m_blankWidget->setVisible(false);
m_parentLayout->addWidget(m_barWidget);
m_parentLayout->addWidget(m_blankWidget);
QSpacerItem *pItem = new QSpacerItem(10, 10, QSizePolicy::Preferred, QSizePolicy::Expanding);
m_barLayout->addSpacerItem(pItem);
}
QSideBar::~QSideBar()
{
}
QToolButton *QSideBar::addTooButton(const QString &strName, const QString &strToolTip, const QIcon &icon)
{
QToolButton *pToolBt = new QToolButton(m_barWidget);
pToolBt->setText(strName);
pToolBt->setToolTip(strToolTip);
pToolBt->setIcon(icon);
pToolBt->setIconSize(QSize(64, 64));
pToolBt->setCheckable(true);
connect(pToolBt, &QToolButton::clicked, this, &QSideBar::showWidget);
m_buttonGroup.addButton(pToolBt);
m_barLayout->insertWidget(m_barLayout->count() - 1, pToolBt);
return pToolBt;
}
void QSideBar::setToolWidget(QToolButton *pToolBt, QWidget *pWidget)
{
m_toolWidget[pToolBt] = pWidget;
if (pWidget)
{
m_parentLayout->addWidget(pWidget);
pWidget->setVisible(false);
}
}
void QSideBar::showWidget()
{
m_blankWidget->setVisible(false);
auto it = m_toolWidget[m_currentToolBt];
if (it)
it->setVisible(false);
QToolButton *pTool = qobject_cast<QToolButton*>(sender());
if (pTool)
{
m_currentToolBt = pTool;
auto it = m_toolWidget[pTool];
if (it)
it->setVisible(true);
else
m_blankWidget->setVisible(true);
}
}
测试代码:
#pragma execution_character_set("utf-8")
#include "qsidebar.h"
#include <QtWidgets/QApplication>
#include <QtWidgets\qlabel.h>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QSideBar w;
w.addTooButton("", "回退", QIcon(":/QSideBar/Resources/Toolbar_Undo_64px.ico"));
w.addTooButton("", "前进", QIcon(":/QSideBar/Resources/Toolbar_Redo_64px.ico"));
QLabel labelPlayList("列表");
w.setToolWidget(w.addTooButton("", "列表", QIcon(":/QSideBar/Resources/Toolbar_Playlist_64px.ico")), &labelPlayList);
QLabel labelCut("剪切");
w.setToolWidget(w.addTooButton("", "剪切", QIcon(":/QSideBar/Resources/Toolbar_Cut_64px.ico")), &labelCut);
QLabel labelSave("保存");
w.setToolWidget(w.addTooButton("", "保存", QIcon(":/QSideBar/Resources/Toolbar_Save_64px.ico")), &labelSave);
QLabel labelReset("重置");
w.setToolWidget(w.addTooButton("", "重置", QIcon(":/QSideBar/Resources/Toolbar_Replay_64px.ico")), &labelReset);
w.show();
return a.exec();
}
交流qq:1245178753