Qt 侧边栏

                      欢迎关注公众号可以查看更多完整文章

通过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

源码下载:QSideBarQt侧边栏.zip_qt侧边栏,qtsidebar-C++代码类资源-CSDN下载

本文地址:Qt 侧边栏_GreenArrowMan-CSDN博客-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GreenArrowMan

请打钱~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值