Qt--自定义抽屉盒子控件
【资料图】
一、前言
因项目需求,需要用到类似于抽屉的控件,归类摆放不同的器件,熟悉Qt的朋友一定马上联想到了QToolBox,我一开始也是这么做的,但是QToolBox有个弊端:它同一时刻只能打开一个抽屉,即抽屉间是互斥的关系。虽然能满足归类的需求,但是实际使用过程中很不便利,我希望能同时打开多个抽屉,抽屉的开关由我自己控制,实现真正的自由。
二、思路
采用QWidget::setVisible(bool)来选择是否显示控件
每添加一个抽屉,就创建一个按钮和一个widget,然后对按钮和widget进去垂直布局,例如:
QT学习基地:
按钮设置setVisible(true),widget设置setVisible(false);
然后对所有把所有按钮链接到同一个槽函数中,用QObject::sender()获取发送对象,然后根据按钮的状态来判断是否显示该按钮对应的widget
三、运行效果
四、详细代码
#ifndef#define#include #include #include #include #include #include #include #include #include #define#defineclass LockerButton : public QPushButton{Q_OBJECTpublic:explicit LockerButton(QWidget* parent = nullptr);void SetImageLabel(const QPixmap &pixmap);void SetTextLabel(QString text);QLabel* GetImageHandle();QLabel* GetTextHandle();bool isOpen;private:// 按钮图标QLabel* m_imageLabel;// 按钮文字QLabel* m_textLabel;};//==================================================================class LockerWidget : public QWidget{Q_OBJECTpublic:explicit LockerWidget(QWidget* parent = nullptr);~LockerWidget();void add_locker(QStringList names,QListwidgets);void deleteAllitemsOfLayout(QLayout* layout);QScrollArea* get_scrollArea() const{return this->scrollArea;}QWidget* get_scrollWidget() const{return this->scrollWidget;}private:void SetUpUI();QVBoxLayout* mainLayout;QVBoxLayout* layout_widgetScroll;LockerButton* m_Button;QWidget* m_Widget;QListButtons;QListWidgets;QScrollArea* scrollArea;QWidget* scrollWidget;QPixmap pixmap_open;QPixmap pixmap_close;public slots:void slot_btn(bool);};#endif// LOCKERWIDGET_H
#include \"lockerwidget.h\"LockerButton::LockerButton(QWidget* parent): QPushButton(parent){m_imageLabel = new QLabel;m_imageLabel->setFixedWidth(32);m_imageLabel->setScaledContents(true);m_imageLabel->setStyleSheet(\"QLabel{background-color:transparent;}\");m_textLabel = new QLabel;m_textLabel->setStyleSheet(\"QLabel{background-color:transparent;}\");QHBoxLayout* mainLayout = new QHBoxLayout;mainLayout->addWidget(m_imageLabel);mainLayout->addWidget(m_textLabel);mainLayout->setMargin(0);mainLayout->setSpacing(4);this->setLayout(mainLayout);this->setStyleSheet(\"background-color:rgb(250,250,250)}\");isOpen = false;}void LockerButton::SetImageLabel(const QPixmap &pixmap){m_imageLabel->setPixmap(pixmap);}void LockerButton::SetTextLabel(QString text){m_textLabel->setText(text);}QLabel* LockerButton::GetImageHandle(){return m_imageLabel;}QLabel* LockerButton::GetTextHandle(){return m_textLabel;}//==================================================================LockerWidget::LockerWidget(QWidget* parent) : QWidget(parent){mainLayout = new QVBoxLayout;mainLayout->setMargin(0);mainLayout->setSpacing(0);this->setLayout(mainLayout);scrollArea = new QScrollArea;mainLayout->addWidget(scrollArea);scrollWidget = new QWidget(this);scrollWidget->setFixedHeight(3000);layout_widgetScroll = new QVBoxLayout(scrollWidget);layout_widgetScroll->setMargin(0);layout_widgetScroll->setSpacing(0);pixmap_open = QPixmap(OPEN_ICON);pixmap_close = QPixmap(CLOSE_ICON);}LockerWidget::~LockerWidget(){LockerButton* l = nullptr;QWidget* w = nullptr;if(Buttons.count()>0) {for(int i=0; i0) {for(int i=0; iwidgets){if(names.count() != widgets.count()) {return;}for(int i=0; iSetTextLabel(names[i]);m_Button->SetImageLabel(pixmap_close);connect(m_Button,&LockerButton::clicked,this,&LockerWidget::slot_btn);m_Widget = new QWidget(this);m_Widget->setVisible(false);QHBoxLayout* layout_widget = new QHBoxLayout(m_Widget);layout_widget->setMargin(0);layout_widget->setSpacing(0);layout_widget->addWidget(widgets[i]);Buttons.push_back(m_Button);Widgets.push_back(m_Widget);}deleteAllitemsOfLayout(layout_widgetScroll);for(int i=0; iaddWidget(Buttons[i]);layout_widgetScroll->addWidget(Widgets[i]);}layout_widgetScroll->addStretch();scrollArea->setWidget(scrollWidget);}void LockerWidget::deleteAllitemsOfLayout(QLayout* layout){QLayoutItem *child;while ((child = layout->takeAt(0)) != nullptr){///setParent为NULL,防止删除之后界面不消失if(child->widget()){child->widget()->setParent(nullptr);}else if(child->layout()){deleteAllitemsOfLayout(child->layout());}delete child;}}void LockerWidget::slot_btn(bool){LockerButton *btn = qobject_cast(sender());int record = -1;for(int i=0; iisOpen = !btn->isOpen;if(btn->isOpen) { //true//切换图标btn->SetImageLabel(pixmap_open);//显示widgetWidgets[record]->setVisible(true);}else { //false//切换图标btn->SetImageLabel(pixmap_close);//隐藏widgetWidgets[record]->setVisible(false);}}//==================================================================
五、代码使用指南
//创建抽屉盒子对象LockerWidget* lockerWidget = new LockerWidget;//准备好抽屉widget(内部放啥自己布局决定)widget_BranchDevice = new QWidget(modelWidget); //支路设备widget_PowerDevice = new QWidget(modelWidget); //电源设备widget_MeasureUnit = new QWidget(modelWidget); //测量设备widget_TransformerDevice = new QWidget(modelWidget); //变压器设备widget_Load = new QWidget(modelWidget); //负荷元件widget_CleanPower = new QWidget(modelWidget); //分布式电源widget_ConmuniceteUnit = new QWidget(modelWidget); //通信元件widget_ConnectUnit = new QWidget(modelWidget); //连接元件widget_LogicDevice = new QWidget(modelWidget); //逻辑设备widget_othersUnit = new QWidget(modelWidget); //其它元件widget_userDIY = new QWidget(modelWidget); //用户自定义元件//准备好抽屉的名字集合、widget集合QStringList names;names << \"电源设备\" << \"支路设备\" << \"变压器设备\" << \"负荷元件\" << \"测量设备\"<< \"分布式电源\" << \"连接元件\" << \"通信元件\" << \"逻辑设备\" << \"其它元件\"<< \"自定义元件\";QListwidgets;widgets << widget_PowerDevice << widget_BranchDevice << widget_TransformerDevice<< widget_Load << widget_MeasureUnit << widget_CleanPower << widget_ConnectUnit<< widget_ConmuniceteUnit << widget_LogicDevice << widget_othersUnit << widget_userDIY;//向抽屉盒子中添加抽屉lockerWidget->add_locker(names,widgets);
【领 QT开发教程 学习资料, 点击下方链接莬费领取↓↓ ,先码住不迷路~】
点击这里:
-
Qt--自定义抽屉盒子控件一、前言因项目需求,需要用到类似于抽屉的控件,归类摆放不同的器件,
-
唐山市举办首届未成年人武术大赛 焦点快看视频摄制记者张宾6月18日,由唐山市文明办、唐山市教育局、唐山市体育
-
世界简讯:11-11数据库凌晨结束的欧洲杯预选赛A组第3轮...11-11数据库凌晨结束的欧洲杯预选赛A组第3轮一场焦点战中,挪威主场1-2
-
has英语怎么读-has1、havehadhas这三个单词中文意思都是“拥有(表示一种状态)”的意思
-
拳皇八神出招视频教程_拳皇xii八神出招表|环球热文1、拳皇97风云再起八神出招方法:2、wsad分别为上下左右,uijk分别为轻
-
广东科学治理“地球癌症”:沙退林进 点“石”成“金”-环球速看料供图中新网广州6月17日电题:广东科学治理“地球癌症”:沙退林进点“
-
全球速看:Warhaven 战争避难所官网地址,官网无法打开Warhaven战争避难由韩产NEXON所研发,其代表着还有《地下城与勇士》《
-
最资讯丨做表格之类的软件(做表格用什么软件好)1、那个叫金山(KINGSOFT)办公软件,WORD是MicrosoftOffice其中的1个而
-
实时焦点:网红男主播被判无期!只因一名慷慨打赏的粉丝……西安中院重审认为,穆嵩和“上线”的手机聊天记录、抓获经过、侦办经过
-
古诗的诗体种类有哪些 中国古代诗歌的诗体特征是指什么?抄写作文网小编为大家提供古诗的诗体种类有哪些中国古代诗歌的诗体特征
-
异世之无爱承欢百度百科 异世之无爱承欢今天来聊聊关于异世之无爱承欢百度百科,异世之无爱承欢的文章,现在就
-
环球观速讯丨诈骗罪3年以上可以被执行缓刑吗一、诈骗罪3年以上可以被执行缓刑吗诈骗罪3年以上不一定可以被执行缓刑
-
云南禄劝乌东德镇:花椒产业风生水起|世界最新路好,到达的比预计的要早。乌东德电站开建后,乌东德镇的基础设施建设
-
防汛防台响应已升级至三级 今日热文新民晚报讯(记者 罗水元)受梅雨带影响,预计今天上午到明天白天本市
-
新消息丨中国有约|一眼千年德化瓷,溯源“世界瓷都”惊艳时光的踪迹中国日报网6月17日电(记者程尔凡)福建德化是中国三大古瓷都之一,其
-
全球今热点:董卫民强调咬定目标 压实责任 确保货运航线安全如期转场6月17日,省委常委、常务副省长董卫民赴鄂州花湖机场调研并召开现场办
-
“楚才还乡”招才引智推介会在京举办“楚才还乡”招才引智推介会在京举办---6月17日下午,由湖北省人民政府
-
OPPO A56加密传递使用方法介绍-每日看点对于现代人来说手机已经是必不可少的常用工具了,无论是年轻人还是老人
-
竹笋怎么储存保鲜 鲜小竹笋怎么储存保鲜-世界短讯1、蒸制法:将挑选好的冬笋除去外壳并洗净,然后将大的冬笋切成两半,
-
金融“及时雨” 浇灌丰收田金融“及时雨”浇灌丰收田
-
转矩的计算公式及单位_转矩的计算公式-天天热资讯1、转矩,即扭矩,公式有:扭矩公式:T=9550P n,T是扭矩,单位N•m,P
-
环球热消息:苏丹冲突双方达成新的72小时临时停火协议当地时间17日,斡旋苏丹冲突并监督停火的沙特与美国发表声明,宣布苏丹
-
海底两万里读后感 海底两万里作者简介1、本书作者儒勒·凡尔纳(1828—1905)是法国科幻小说家,现代科幻小说
-
范巍_关于范巍的简介音频解说1、范巍,中国人事科学研究院企业人事管理研究室主任、职业标
-
真我Realme 11最高支持多大内存扩展 世界快资讯随着手机技术的不断发展进步,现在的手机功能是越来越全面的,各大手机
-
“荷”美山村 环球头条6月17日,长沙市望诚区莲花镇云坪村湖湾里芬芳斗艳的荷花,把山村装扮
-
不以山海为远——中国传统文化惊艳丹麦凡岛国际风筝节 天天热点评新华社哥本哈根6月16日电 通讯:不以山海为远——中国传统文化惊艳丹
-
推荐一些高质量的快穿文女配不掺和(快穿)作者:风流书呆一句话简介:女配不掺和,主角玩不转
-
世界观焦点:我以为我能够歌词是什么意思_我以为我能够 雷诺儿1、临界雷诺数是在流体的流态由层流向紊流转变时,所测得的雷诺数;而下
-
《The Moon》:导演新作,D.O.与薛耿求搭档出演,影迷期待|每日看点由薛耿求、都敬秀DO及金喜爱主演的科幻电影《TheMoon》将8月在韩上映,