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

运行截图:

时间: 2024-07-30 20:26:51

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

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

引言 工具条作为大多数标准的Windows应用程序的一个重要组成部分,使其成为促进人机界面友好的一个重要工具.通过工具条极大方便了用户对程序的操作,但是在由Microsoft Visual C++开发环境所创建的应用程序框架中的工具条只是一个简单的按钮的集合,在功能上也仅仅是起到了菜单快捷方式的作用,而没有做到象VC.Word等软件的工具条那样,提供多种不同类型的标准控件如组合框.编辑框等.尤其是组合框在添加到工具条上后,可将原本需要在弹出对话框中完成的交互操作在工具条上就可以进行,从而在很大程

扩展GroupBox控件

1.GroupBox的边框颜色可以自行设置: 2.GroupBox可以设置边框的为圆角: 3.设置GroupBox标题在控件中的位置. 4.设置GroupBox标题的字体和颜色. 具体实现步骤Panel扩展一样,直接看具体的代码,代码如下: public class GroupBoxEx : GroupBox { private Font _titleFont = new Font("宋体", 10, FontStyle.Regular); private Color _titleCo

Duilib实现GroupBox控件

转载:http://blog.csdn.net/asd313346541/article/details/47055113 原作者的源码上说:右边线和下边线显示不出来: 后来经过调试研究测试猜测应该是没有给控件设置borderround属性,后来设置后出来效果: 最后放上源码(稍微做了修改): .h文件 1 #ifndef _UIGROUPBOX_H_ 2 #define _UIGROUPBOX_H_ 3 4 #define GROUPBOX_TEXT_OFFSET 40 //定义GroupBo

用继承和组合方式定制控件

1. 定制控件的方式 2. 带标签的文本编辑框(不带命名空间) 3. 带图标的文本框(带命名空间) 4. 控件属性验证 1. 定制控件的方式 <1>继承其他控件类 Ctrl + 左键 --->EditText <2>组合方式. 当前控件类从容器类继承, 并将若干个控件添加到当前容器中 <3>绘制控件. 也就是控件类从View继承, 并在onDraw方法中从零开始绘制控件, 例如TextView 2. 带标签的文本编辑框(不带命名空间)

多选下拉框用户控件

多个控件组合为用户控件,实现多选 1.CSS文件 .MultDropList {display:inline-block;} .labelArea {vertical-align:super} .DropList {display:inline-block; height:20px;margin-top:5px;margin-left:2px;border:1px solid #ccc;  cursor:pointer; background:url(/UserControl/MultDropD

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

1. 在Form中放一个控件,让其在启动时始终居中 int gLeft = this.Width / 2 - groupControl1.Width / 2; int gTop = this.Height / 2 - groupControl1.Height / 2; groupControl1.Location = new Point(gLeft, gTop);. 2.在设计界面时,先把groupbox控件放到窗体中间位置,然后anchor属性 设置为none 即可

android自定义View之(七)------自定义控件组合仿actionbar控件

我们前面写了6个自定义view的样例,这都是全新自已画的控件.在这个样例中,我们来用几个现有的控件来组合成一个新的控件. 效果图: 我们用二个Button和一个TextView组合来成为一个actionbar,下面先来一个效果图: 关键代码: (1)res/layout/custom_action_bar.xml----组合控件布局文件 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android&quo

自定义控件进阶02_侧滑删除,粘性控件

1 快速索引 细节问题: 1.1 把当前被选中的字母索引置为灰色,否则为白色 每一次在快速索引栏上的触摸事件都触发invalidate(),重走onDraw()方法 在onDraw()方法里,做判断,如果通过触摸事件计算的索引与绘制字母数组的索引一致时就更改画笔的颜色,(记得在触摸事件中如果手指抬起,就把计算的索引置为-1) 1.2 弹出吐司不太好看,弹出一个圆角的矩形框会好看一些(实际上就是一个圆角的TextView,平常隐藏,滑动的时候显示) 圆角:定义背景的xml文件,shape根节点,弧

3、用继承和组合方式定制控件

定制控件的方式 ? 继承其它控件类(EditText.Button) ? 组合方式.当前控件类从容器类继承,并将若干个控件添加到当前的容器中. ? 绘制控件,也就是控件类从View继承,并在onDraw方法中从零绘制 控件.例如,TextView.  带标签的文本编辑框(不带命名空间) 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http: