Qt自定义控件之可伸缩组合框(GroupBox)控件
阅读原文时间:2023年07月08日阅读:1

本文基于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
#include

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 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
#include
#include
#include
#include
#include
#include

#include

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();  

}

运行截图:

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章