样板图
功能描述:
1、可以单个勾选、也可以按钮一次性全部勾选和清除。
2、能够响应勾选和清除的状态,样例代码中是qDebug输出。
代码详解
checkwidget.h头文件
// checkwidget.h
// @Author : fy
#ifndef CHECKWIDGET_H
#define CHECKWIDGET_H
#include <QWidget>
#include <QCheckBox>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QPushButton>
#include <QGroupBox>
#include <QVector>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class CheckWidget : public QWidget
{
Q_OBJECT
public:
CheckWidget(QWidget *parent = nullptr);
~CheckWidget();
private:
void initUI();
private:
Ui::Widget *ui;
QVector<QCheckBox *> m_vCheckBox; // 存放选择按钮组
QVector<QVBoxLayout *> m_vVLayout; // 存放多列CheckBox
QHBoxLayout *totalCheckLayout; // 存放整体checkBox组
QPushButton *m_selectAll; // 选择全部
QPushButton *m_clearAll; // 清理全部
QVBoxLayout *vwidget; // 整体布局
QVBoxLayout *totalwidget; // 整体布局框架
QHBoxLayout *htitle; // 顶部布局
QVBoxLayout *vbox; // 下部布局
QGroupBox *g_totalbox; // 整体框架
QGroupBox *g_checkbox; // 选择框框架
private slots:
void cbChanged(int state);
void selectButtonPress(); // 当选择全部时
void clearButtonPress(); // 当清理全部时
};
#endif // CHECKWIDGET_H
checkwidget.cpp文件
// checkwidget.h
// @Author : fy
#include "checkwidget.h"
#include "ui_widget.h"
#include <QVBoxLayout>
#include <QDebug>
CheckWidget::CheckWidget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
initUI();
}
CheckWidget::~CheckWidget()
{
delete ui;
}
void CheckWidget::initUI()
{
this->setWindowTitle("QCheckBox 示例");
setGeometry(100,100,300,200);
// 装填
for(int i = 0 ;i<10;i++)
{
m_vCheckBox.append(new QCheckBox(QString("选项")+QString::number(i),this));
}
// 两个Group组件
this->g_totalbox = new QGroupBox();
this->g_checkbox = new QGroupBox();
g_totalbox->setTitle("选择组件");
g_checkbox->setTitle("组件");
this->vwidget = new QVBoxLayout(); // 一个布局整体
this->totalwidget = new QVBoxLayout(); // 一个存放整体QGroupBox布局
this->htitle = new QHBoxLayout(); // 存放按钮组水平布局
htitle->addStretch(0); // 伸缩为0
// htitle->setDirection(QBoxLayout::RightToLeft);
this->m_selectAll = new QPushButton("选择全部");
this->m_clearAll = new QPushButton("清理全部");
this->m_selectAll->setFixedSize(100,50);
this->m_clearAll->setFixedSize(100,50);
htitle->addWidget(m_selectAll);
htitle->addWidget(m_clearAll);
// checkbox 布局分布设置
vbox = nullptr;
for(int count =0, i=0;i<m_vCheckBox.size();i++)
{
if(i%2 == 0) { vbox = new QVBoxLayout(); }
vbox->addWidget(m_vCheckBox.at(i));
if(i%2 == 0 && !(vbox->isEmpty()))
{
count++;
m_vVLayout.append(vbox);
}
}
totalCheckLayout = new QHBoxLayout;
// 存放多个垂直CheckBox组
for(int i=0;i<m_vVLayout.size();i++)
{
totalCheckLayout->addLayout(m_vVLayout.at(i));
}
g_checkbox->setLayout(totalCheckLayout);
// 顶部和checkBox组,存放一个布局中
vwidget->addLayout(htitle);
vwidget->addWidget(g_checkbox);
// 整体布局存放在一个GroupBox中,然后存放在一个布局中
g_totalbox->setLayout(vwidget);
totalwidget->addWidget(g_totalbox);
// 设置界面
setLayout(totalwidget);
// 每一个CheckBox都能选择
for(int i=0;i<m_vCheckBox.size();i++)
{
connect(m_vCheckBox.at(i),&QCheckBox::stateChanged,this,&CheckWidget::cbChanged);
}
connect(m_selectAll,&QPushButton::clicked,this,&CheckWidget::selectButtonPress);
connect(m_clearAll,&QPushButton::clicked,this,&CheckWidget::clearButtonPress);
}
void CheckWidget::cbChanged(int state)
{
QCheckBox *cb=qobject_cast<QCheckBox *>(sender());
if(state == Qt::Checked)
{
qDebug()<<cb->text()<<"被选中";
}
if(state == Qt::Unchecked)
{
qDebug()<<cb->text()<<"被取消选中";
}
}
void CheckWidget::selectButtonPress()
{
for(int i=0;i<this->m_vCheckBox.size();i++)
{
this->m_vCheckBox.at(i)->setChecked(true);
}
}
void CheckWidget::clearButtonPress()
{
for(int i=0;i<this->m_vCheckBox.size();i++)
{
this->m_vCheckBox.at(i)->setChecked(false);
}
}