Qt 侧边栏

来源:互联网 发布:网络会员管理系统免费 编辑:程序博客网 时间:2024/06/05 09:13

通过QToolButton来实现侧边栏,或者说侧边工具栏,可以通过接口直接自由添加按钮,可以设置工具按钮对应的QWidget,进而点击不同的按钮可以显示不同的QWidget。


实现代码:

[cpp] view plain copy
print?
  1. #ifndef QSIDEBAR_H  
  2. #define QSIDEBAR_H  
  3.   
  4. #include <QtWidgets/QWidget>  
  5. #include <QtWidgets/qtoolbutton.h>  
  6. #include <QVBoxLayout>  
  7. #include <qmap.h>  
  8. #include <qbuttongroup.h>  
  9.   
  10. class QSideBar : public QWidget  
  11. {  
  12.     Q_OBJECT  
  13.   
  14. public:  
  15.     QSideBar(QWidget *parent = 0);  
  16.     ~QSideBar();  
  17.   
  18.     QToolButton* addTooButton(const QString &strName, const QString &strToolTip, const QIcon &icon);  
  19.     void setToolWidget(QToolButton *pToolBt, QWidget *pWidget);  
  20. private:  
  21.     void showWidget();  
  22.   
  23.     QWidget *m_barWidget;  
  24.     QVBoxLayout *m_barLayout;  
  25.     QVector<QToolButton*> m_toolBts;  
  26.   
  27.     QHBoxLayout *m_parentLayout;  
  28.     QWidget *m_blankWidget;  
  29.     QMap<QToolButton *, QWidget *> m_toolWidget;  
  30.   
  31.     QToolButton *m_currentToolBt;  
  32.   
  33.     QButtonGroup m_buttonGroup;  
  34. };  
  35.   
  36. #endif // QSIDEBAR_H  
[cpp] view plain copy
print?
  1. #include "qsidebar.h"  
  2.   
  3. QSideBar::QSideBar(QWidget *parent)  
  4. : QWidget(parent), m_currentToolBt(NULL)  
  5. {  
  6.     m_parentLayout = new QHBoxLayout(this);  
  7.     m_parentLayout->setContentsMargins(0, 0, 0, 0);  
  8.     m_barWidget = new QWidget(this);  
  9.     m_barWidget->setFixedWidth(64);  
  10.     m_barLayout = new QVBoxLayout(m_barWidget);  
  11.     m_barLayout->setContentsMargins(0, 0, 0, 0);  
  12.     m_barLayout->setSpacing(0);  
  13.   
  14.     m_blankWidget = new QWidget(this);  
  15.     //m_blankWidget->setVisible(false);  
  16.   
  17.     m_parentLayout->addWidget(m_barWidget);  
  18.     m_parentLayout->addWidget(m_blankWidget);  
  19.   
  20.     QSpacerItem *pItem = new QSpacerItem(10, 10, QSizePolicy::Preferred, QSizePolicy::Expanding);  
  21.     m_barLayout->addSpacerItem(pItem);  
  22. }  
  23.   
  24. QSideBar::~QSideBar()  
  25. {  
  26.   
  27. }  
  28.   
  29. QToolButton *QSideBar::addTooButton(const QString &strName, const QString &strToolTip, const QIcon &icon)  
  30. {  
  31.     QToolButton *pToolBt = new QToolButton(m_barWidget);  
  32.     pToolBt->setText(strName);  
  33.     pToolBt->setToolTip(strToolTip);  
  34.     pToolBt->setIcon(icon);  
  35.     pToolBt->setIconSize(QSize(64, 64));  
  36.     pToolBt->setCheckable(true);  
  37.     connect(pToolBt, &QToolButton::clicked, this, &QSideBar::showWidget);  
  38.     m_buttonGroup.addButton(pToolBt);  
  39.   
  40.     m_barLayout->insertWidget(m_barLayout->count() - 1, pToolBt);  
  41.     return pToolBt;  
  42. }  
  43.   
  44. void QSideBar::setToolWidget(QToolButton *pToolBt, QWidget *pWidget)  
  45. {  
  46.     m_toolWidget[pToolBt] = pWidget;  
  47.     if (pWidget)  
  48.     {  
  49.         m_parentLayout->addWidget(pWidget);  
  50.         pWidget->setVisible(false);  
  51.     }  
  52. }  
  53.   
  54. void QSideBar::showWidget()  
  55. {  
  56.     m_blankWidget->setVisible(false);  
  57.     auto it = m_toolWidget[m_currentToolBt];  
  58.     if (it)  
  59.         it->setVisible(false);  
  60.   
  61.     QToolButton *pTool = qobject_cast<QToolButton*>(sender());  
  62.     if (pTool)  
  63.     {  
  64.         m_currentToolBt = pTool;  
  65.   
  66.         auto it = m_toolWidget[pTool];  
  67.         if (it)  
  68.             it->setVisible(true);  
  69.         else  
  70.             m_blankWidget->setVisible(true);  
  71.     }  
  72. }  

测试代码:

[cpp] view plain copy
print?
  1. #pragma execution_character_set("utf-8")  
  2. #include "qsidebar.h"  
  3. #include <QtWidgets/QApplication>  
  4. #include <QtWidgets\qlabel.h>  
  5.   
  6. int main(int argc, char *argv[])  
  7. {  
  8.     QApplication a(argc, argv);  
  9.     QSideBar w;  
  10.   
  11.     w.addTooButton("""回退", QIcon(":/QSideBar/Resources/Toolbar_Undo_64px.ico"));  
  12.     w.addTooButton("""前进", QIcon(":/QSideBar/Resources/Toolbar_Redo_64px.ico"));  
  13.   
  14.     QLabel labelPlayList("列表");  
  15.     w.setToolWidget(w.addTooButton("""列表", QIcon(":/QSideBar/Resources/Toolbar_Playlist_64px.ico")), &labelPlayList);  
  16.     QLabel labelCut("剪切");  
  17.     w.setToolWidget(w.addTooButton("""剪切", QIcon(":/QSideBar/Resources/Toolbar_Cut_64px.ico")), &labelCut);  
  18.     QLabel labelSave("保存");  
  19.     w.setToolWidget(w.addTooButton("""保存", QIcon(":/QSideBar/Resources/Toolbar_Save_64px.ico")), &labelSave);  
  20.     QLabel labelReset("重置");  
  21.     w.setToolWidget(w.addTooButton("""重置", QIcon(":/QSideBar/Resources/Toolbar_Replay_64px.ico")), &labelReset);  
  22.   
  23.     w.show();  
  24.     return a.exec();  
  25. }  

交流qq:1245178753

源码下载:http://download.csdn.net/detail/u011417605/9661478

本文地址:http://blog.csdn.net/u011417605/article/details/52901296