Qt学习——基于QGroupBox的扩展收缩框

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 不仅提供了自定义的勾选框图标,还增加了根据勾选状态动态显示或隐藏内部控件的功能。这种设计模式提高了控件的可重用性和扩展性。

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值