https://www.cnblogs.com/jiangbin/p/6752957.html
根据提供的代码和文章内容,ExtendedGroupBox
是一个继承自 QGroupBox
的自定义控件,增加了一个伸缩功能,允许组合框内的控件在组合框被点击时显示或隐藏。以下是详细介绍:
1. 定义 ExtendedGroupBox 类
首先,定义了一个 ExtendedGroupBox
类,它包含两个状态:STATE_NORMAL
(默认状态,控件隐藏)和 STATE_EXPAND
(扩展状态,控件显示)。
enum State { STATE_NORMAL, STATE_EXPAND };
class ExtendedGroupBox : public QGroupBox {
Q_OBJECT
public:
ExtendedGroupBox(QWidget *parent = nullptr, State state = STATE_NORMAL);
ExtendedGroupBox(const QString &title, QWidget *parent = nullptr, State state = STATE_NORMAL);
private slots:
void onChecked(bool checked);
public:
void addWidget(QWidget *widget);
State getState() const;
private:
QVector<QWidget*> children_;
State state_;
};
2. 初始化 ExtendedGroupBox
构造函数中,ExtendedGroupBox
设置为可勾选(setCheckable(true)
),并根据传入的状态设置初始勾选状态和是否平直(无边框)。
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)));
}
3. 处理勾选状态变化
onChecked
槽函数响应勾选状态的变化。当 ExtendedGroupBox
被勾选时,它将设置为非平直(有边框),并显示所有子控件。当取消勾选时,将隐藏所有子控件并设置为平直。
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;
}
}
4. 管理子控件
addWidget
函数用于将子控件添加到 ExtendedGroupBox
的内部列表 children_
中,并根据当前状态设置子控件的可见性。
void ExtendedGroupBox::addWidget(QWidget *widget) {
if (widget != nullptr) {
if (state_ == STATE_NORMAL) {
widget->setVisible(false);
}
children_.push_back(widget);
}
}
5. 使用 ExtendedGroupBox
在主函数或其他函数中,创建 ExtendedGroupBox
的实例,设置其标题,添加子控件,并将其添加到主布局中。
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");
// ... 添加其他控件到 advanced_setting_layout ...
// 将子控件添加到 ExtendedGroupBox 的 children_ 列表中
advanced_setting_group_box->addWidget(check_box4);
// ... 重复为其他控件 ...
6. 样式自定义
通过 QSS 自定义 ExtendedGroupBox
的勾选框样式,包括勾选和未勾选状态的图标。
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);
}
通过这种方式,ExtendedGroupBox
不仅提供了自定义的勾选框图标,还增加了根据勾选状态动态显示或隐藏内部控件的功能。这种设计模式提高了控件的可重用性和扩展性。