赞
踩
通过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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。