Qt自定义控件之可伸缩组合框(GroupBox)控件
摘要
本文基于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)控件的更多相关文章
- (转载)VC/MFC 工具栏上动态添加组合框等控件的方法
引言 工具条作为大多数标准的Windows应用程序的 一个重要组成部分,使其成为促进人机界面友好的一个重要工具.通过工具条极大方便了用户对程序的操作,但是在由Microsoft Visual C++开 ...
- VC/MFC 工具栏上动态添加组合框等控件的方法
引言 工具条作为大多数标准的Windows应用程序的一个重要组成部分,使其成为促进人机界面友好的一个重要工具.通过工具条极大方便了用户对程序的操作,但是在由Microsoft Visual C++开发 ...
- 扩展GroupBox控件
1.GroupBox的边框颜色可以自行设置: 2.GroupBox可以设置边框的为圆角: 3.设置GroupBox标题在控件中的位置. 4.设置GroupBox标题的字体和颜色. 具体实现步骤Pane ...
- 用MVC的辅助方法自定义了两个控件:“可编辑的下拉框控件”和“文本框日历控件”
接触MVC也没多长时间,一开始学的时候绝得MVC结构比较清晰.后来入了门具体操作下来感觉MVC控件怎么这么少还不可以像ASP.net form那样拖拽.这样设计界面来,想我种以前没学过JS,Jquer ...
- Duilib实现GroupBox控件
转载:http://blog.csdn.net/asd313346541/article/details/47055113 原作者的源码上说:右边线和下边线显示不出来: 后来经过调试研究测试猜测应该是 ...
- C#之菜单控件、主窗体打开子窗体、GroupBox控件使用
一.背景 一年前有学习过C#,但没有在项目中去实际做APP,重新捡起来应用到项目中.我同事本来做好一个CANOPEN设备管理的界面,由于近期搜索了别人的开发的界面,我觉得有很多东西要重新安排,以及我已 ...
- win32: 文本编辑框(Edit)控件响应事件
过去几年,关于文本编辑框(Edit)控件的响应事件,我都是在主程序 while(GetMessage(&messages, NULL, 0, 0)) { ... } 捕获. 总感觉这种方式让人 ...
- WPF自定义控件(二)の重写原生控件样式模板
话外篇: 要写一个圆形控件,用Clip,重写模板,去除样式引用圆形图片可以有这三种方式. 开发过程中,我们有时候用WPF原生的控件就能实现自己的需求,但是样式.风格并不能满足我们的需求,那么我们该怎么 ...
- winform groupbox控件放到窗体中间位置
1. 在Form中放一个控件,让其在启动时始终居中 int gLeft = this.Width / 2 - groupControl1.Width / 2; int gTop = this.Heig ...
随机推荐
- Solution -「ZJOI 2019」「洛谷 P5326」开关
\(\mathcal{Description}\) Link. 有 \(n\) 个开关,初始时所有开关的状态为 \(0\).给定开关的目标状态 \(s_1,s_2,\cdots,s_n\).每 ...
- tomcat的基本使用及项目部署
tomcat介绍 我们在学习Javaweb的时候,最普遍使用的服务器j就是阿帕奇的tomcat,主要是用来处理jsp和servlet的请求以及响应 tomcat的启动和关闭 在我们安装完tomcat后 ...
- 云原生 PostgreSQL - CrunchyData PGO 教程:创建、连接、删除 Postgres 集群
入门 作为安装的一部分,请确保您已完成以下操作: 分叉 Postgres Operator 示例存储库并将其克隆到您的主机. https://github.com/CrunchyData/postgr ...
- python中面向对象知识框架
案列: 1 class Chinese: # 类的创建,类名首字母要大写 2 eye = 'black' # 类属性的创建 3 4 def __init__(self,hometown): # 类的初 ...
- 三种移除list中的元素(可靠)
/** * 直接使用foreach方法移除list中的元素会抛异常 * Exception in thread "main" java.util.ConcurrentModific ...
- #刷题记录--剑指 Offer 07. 重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 抓住一点,通过递归进行节点创建时,是按照 前序遍历数组 进行创建的. 根节点,根节点的左 ...
- 【k8s中无法使用jstack和arthas的解决方案】1: Unable to get pid of LinuxThreads manager thread
使用alpine镜像,jstack和arthas等无法连接到pid为1的java进程 k8s容器中执行结果 / # jstack 1 1: Unable to get pid of LinuxThre ...
- 【转】int和Integer的区别
int和Integer的区别: 1.Integer是int的包装类,int则是java的一种基本数据类型 2.Integer变量必须实例化后才能使用,而int变量不需要 3.Integer实际是对象的 ...
- 微信小程序wifi控制开发
小程序wifi控制开发方案 ----- 由小程序通过公众号给wifi控制板进行配网,后台服务器自动生成设备名并注册在数据库中,wifi控制板自动保存生成的设备名,小程序可读取WIFI控制板的数据,控制 ...
- Clickhouse - MergeTree原理
Clickhouse - MergeTree原理 MergeTree引擎以及隶属于MergeTree引擎族的所有引擎是Clickhouse表引擎中最重要, 最强大的引擎. MergeTree引擎族中的 ...