摘要

本文基于QGroupBox扩展了一种可以伸缩的组合框,正常状态下,组合框处于收缩状态,内部的控件是隐藏的;需要的时候,可以将组合框进行伸展,并将内部控件显示出来。

正文

实现的代码比较简单,主要有以下几点:

1、该组合框继承于QGroupBox;

2、通过QSS将QGroupBox的默认Check图标替换;

3、通过QGroupBox的setFlat函数显示隐藏垂直边框

4、使用时,设置父窗口的layout的SizeConstraint为SetFixedSize,否则否则在ExtendedGroupBox收缩时,无法动态调整大小。

代码如下:

QSS样式:

QGroupBox#ExtendedGroupBox::indicator
{
width: 8px;
height: 8px;
} QGroupBox#ExtendedGroupBox::indicator:unchecked
{
image: url(:/icons/uncheck.png);
} QGroupBox#ExtendedGroupBox::indicator:checked
{
image: url(:/icons/check.png);
}
#ifndef EXTENDED_GROUP_BOX_H_
#define EXTENDED_GROUP_BOX_H_ #include <QGroupBox>
#include <QVector> class ExtendedGroupBox : public QGroupBox
{
Q_OBJECT public:
enum State
{
STATE_NORMAL,
STATE_EXPAND
}; public:
ExtendedGroupBox(QWidget *parent = nullptr, State state = STATE_NORMAL);
ExtendedGroupBox(const QString &title, QWidget *parent = nullptr, State state = STATE_NORMAL); private Q_SLOTS:
void onChecked(bool checked); public:
void addWidget(QWidget *widget);
State getState() const; private:
QVector<QWidget*> children_;
State state_;
}; #endif//EXTENDED_GROUP_BOX_H_
#include "ExtendedGroupBox.h"

ExtendedGroupBox::ExtendedGroupBox(QWidget *parent /*= nullptr*/, State state /*= STATE_NORMAL*/)
: QGroupBox(parent)
{
setObjectName("ExtendedGroupBox");
setCheckable(true);
state_ = state;
if (state_ == STATE_NORMAL)
{
//隐藏垂直边框
setFlat(true);
setChecked(false);
}
connect(this, SIGNAL(clicked(bool)), this, SLOT(onChecked(bool)));
} ExtendedGroupBox::ExtendedGroupBox(const QString &title, QWidget *parent /*= nullptr*/, State state /*= STATE_NORMAL*/)
: QGroupBox(title, parent)
{
setObjectName("ExtendedGroupBox");
setCheckable(true);
state_ = state;
if (state_ == STATE_NORMAL)
{
//隐藏垂直边框
setFlat(true);
setChecked(false);
}
connect(this, SIGNAL(clicked(bool)), this, SLOT(onChecked(bool)));
} void ExtendedGroupBox::addWidget(QWidget *widget)
{
if (widget != nullptr)
{
if (state_ == STATE_NORMAL)
{
widget->setVisible(false);
}
children_.push_back(widget);
}
} void ExtendedGroupBox::onChecked(bool checked)
{
if (checked)
{
//显示垂直边框
setFlat(false);
for (auto iter = children_.begin(); iter != children_.end(); ++iter)
{
(*iter)->setVisible(true);
}
state_ = STATE_EXPAND;
}
else
{
//隐藏垂直边框
setFlat(true);
for (auto iter = children_.begin(); iter != children_.end(); ++iter)
{
(*iter)->setVisible(false);
}
state_ = STATE_NORMAL;
}
} ExtendedGroupBox::State ExtendedGroupBox::getState() const
{
return state_;
}
#include "ExtendedGroupBox.h"

#include <QDialog>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QFormLayout>
#include <QCheckBox>
#include <QProgressBar>
#include <QFile> #include <QtWidgets/QApplication> int main(int argc, char *argv[])
{
QApplication a(argc, argv); QFile file(":/stylesheets/style.qss");
bool s = file.open(QFile::ReadOnly);
a.setStyleSheet(file.readAll());
file.close(); QDialog w;
QVBoxLayout *vbox_layout = new QVBoxLayout(); //设置窗口的layout的SizeConstraint为SetFixedSize,
//否则在ExtendedGroupBox收缩时,无法动态调整大小。
vbox_layout->setSizeConstraint(QLayout::SetFixedSize);
w.setLayout(vbox_layout); QGroupBox *setting_group_box = new QGroupBox(("Setting"));
QHBoxLayout *setting_layout = new QHBoxLayout();
setting_group_box->setLayout(setting_layout); QCheckBox *check_box1 = new QCheckBox(("CheckBox1"));
QCheckBox *check_box2 = new QCheckBox(("CheckBox2"));
QCheckBox *check_box3 = new QCheckBox(("CheckBox3"));
setting_layout->addWidget(check_box1);
setting_layout->addWidget(check_box2);
setting_layout->addWidget(check_box3); ExtendedGroupBox *advanced_setting_group_box = new ExtendedGroupBox(("Advanced Setting"), &w, ExtendedGroupBox::STATE_NORMAL);
QHBoxLayout *advanced_setting_layout = new QHBoxLayout();
advanced_setting_group_box->setLayout(advanced_setting_layout); QCheckBox *check_box4 = new QCheckBox(("CheckBox4"));
QCheckBox *check_box5 = new QCheckBox(("CheckBox5"));
QCheckBox *check_box6 = new QCheckBox(("CheckBox6"));
advanced_setting_layout->addWidget(check_box4);
advanced_setting_layout->addWidget(check_box5);
advanced_setting_layout->addWidget(check_box6); //将子控件添加到ExtendedGroupBox中
advanced_setting_group_box->addWidget(check_box4);
advanced_setting_group_box->addWidget(check_box5);
advanced_setting_group_box->addWidget(check_box6); vbox_layout->addWidget(setting_group_box);
vbox_layout->addWidget(advanced_setting_group_box); w.show();
return a.exec();
}

运行截图:

Qt自定义控件之可伸缩组合框(GroupBox)控件的更多相关文章

  1. (转载)VC/MFC 工具栏上动态添加组合框等控件的方法

    引言 工具条作为大多数标准的Windows应用程序的 一个重要组成部分,使其成为促进人机界面友好的一个重要工具.通过工具条极大方便了用户对程序的操作,但是在由Microsoft Visual C++开 ...

  2. VC/MFC 工具栏上动态添加组合框等控件的方法

    引言 工具条作为大多数标准的Windows应用程序的一个重要组成部分,使其成为促进人机界面友好的一个重要工具.通过工具条极大方便了用户对程序的操作,但是在由Microsoft Visual C++开发 ...

  3. 扩展GroupBox控件

    1.GroupBox的边框颜色可以自行设置: 2.GroupBox可以设置边框的为圆角: 3.设置GroupBox标题在控件中的位置. 4.设置GroupBox标题的字体和颜色. 具体实现步骤Pane ...

  4. 用MVC的辅助方法自定义了两个控件:“可编辑的下拉框控件”和“文本框日历控件”

    接触MVC也没多长时间,一开始学的时候绝得MVC结构比较清晰.后来入了门具体操作下来感觉MVC控件怎么这么少还不可以像ASP.net form那样拖拽.这样设计界面来,想我种以前没学过JS,Jquer ...

  5. Duilib实现GroupBox控件

    转载:http://blog.csdn.net/asd313346541/article/details/47055113 原作者的源码上说:右边线和下边线显示不出来: 后来经过调试研究测试猜测应该是 ...

  6. C#之菜单控件、主窗体打开子窗体、GroupBox控件使用

    一.背景 一年前有学习过C#,但没有在项目中去实际做APP,重新捡起来应用到项目中.我同事本来做好一个CANOPEN设备管理的界面,由于近期搜索了别人的开发的界面,我觉得有很多东西要重新安排,以及我已 ...

  7. win32: 文本编辑框(Edit)控件响应事件

    过去几年,关于文本编辑框(Edit)控件的响应事件,我都是在主程序 while(GetMessage(&messages, NULL, 0, 0)) { ... } 捕获. 总感觉这种方式让人 ...

  8. WPF自定义控件(二)の重写原生控件样式模板

    话外篇: 要写一个圆形控件,用Clip,重写模板,去除样式引用圆形图片可以有这三种方式. 开发过程中,我们有时候用WPF原生的控件就能实现自己的需求,但是样式.风格并不能满足我们的需求,那么我们该怎么 ...

  9. winform groupbox控件放到窗体中间位置

    1. 在Form中放一个控件,让其在启动时始终居中 int gLeft = this.Width / 2 - groupControl1.Width / 2; int gTop = this.Heig ...

随机推荐

  1. Solution -「NOI 2008」「洛谷 P3980」志愿者招募

    \(\mathcal{Description}\)   Link.   一项持续 \(n\) 天的任务,第 \(i\) 天需要至少 \(a_i\) 人工作.还有 \(m\) 种雇佣方式,第 \(i\) ...

  2. VS Code Java 2 月更新!教育特别版:单元测试、GUI开发支持、Gradle项目创建、以及更多!

    新春快乐!欢迎来到 Visual Studio Code Java 的 2 月更新,这个月我们给大家带来了一期教育特别版.每年的年初是许多学校开学的时间,为了给学生和教师提供在 Visual Stud ...

  3. 暑假撸系统1-先把git后悔药准备好!

    学校规定让暑假自己撸一款在线考试系统,其实的确需要一个款在线的考试系统系统,因为平时学校是使用Excel讲解选择题的.基于这个目标那么就话不多说.开干! 本来趁着项目想练练手,使用些新学习的技能看看, ...

  4. 私有化轻量级持续集成部署方案--05-持续部署服务-Drone(上)

    提示:本系列笔记全部存在于 Github, 可以直接在 Github 查看全部笔记 持续部署概述 持续部署是能以自动化方式,频繁而且持续性的,将软件部署到生产环境.使软件产品能够快速迭代. 在之前部署 ...

  5. Spring Boot Starter 理解

    个人理解 快速集成,快速基础配置. 参考 深入springboot原理--一步步分析springboot启动机制(starter机制) 深入springboot原理--动手封装一个starter

  6. excel写入数值型内容

    一开始的想法是设置单元格格式为数值型 XSSFDataFormat format= (XSSFDataFormat) workbook.createDataFormat(); CellStyle cs ...

  7. RENIX报文字段跳变——网络测试仪实操

    什么是报文字段跳变? 报文字段跳变是指字段的值进行一些列有规则的变化,Renix支持对字段进行递增.递减.列表和随机变化. 如当用户想要仿真大量的源IP变化的数据时,就可以使用Modifier进行规则 ...

  8. [MethodImpl(MethodImplOptions.Synchronized)]与lock机制

    [MethodImpl(MethodImplOptions.Synchronized)]与lock机制 在进行.NET开发时,经常会遇见如何保持线程同步的情况.在众多的线程同步的可选方式中,加锁无疑是 ...

  9. js根据ClassName来删除元素(有坑误入)

    今天,被一个很简单的问题坑了一下午,基础不扎实.(js根据class名称来删除Dom元素) 但是结果却不是这样的.弄了好久还不知道怎么回事.最后找到了答案. 结果如下:为啥还有test2,4,6呢. ...

  10. IIS部署遇到问题(没有相关资源/权限不足无法读取配置文件)及解决方法

    1:找不到web.config,如下图: 解决办法: 点击目录浏览--打开功能--启用(应用),再次浏览解决 2:再次预览出现别的错误500.19,权限不足,如下图: 解决办法:(右键编辑权限或者右上 ...