QTableView 添加QCheckbox 并实现全选和批量删除

QTableView 添加QCheckbox
本文主要功能是:在QTableview 中添加QCheckBox ,并能实现大小自适应,全选按钮的变化(点击全选,可以使 QtableView 中的所有的 Qcheckbox 都选择,任何一个子QCheckBox 变化都会影响全选按钮),以及批量删除的功能,代码不是很优化!!!

上代码
NatiavIsolationDilog .h

#ifndef NATIAVISOLATIONDILOG_H
#define NATIAVISOLATIONDILOG_H

#include <QWidget>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QLabel>
#include <QTableView>
#include <QCheckBox>
#include <QPushButton>
#include <QStandardItem>
#include <QStandardItemModel>

//隔离弹窗
class NatiavIsolationDilog : public QWidget
{
    Q_OBJECT
public:
    explicit NatiavIsolationDilog(QWidget *parent = nullptr);

    void initGUI();   //界面初始化
    QHBoxLayout *initTableWidget();   //初始化中间tableview布局
    void loadData();//加载数据

protected:
    void resizeEvent(QResizeEvent *event);
signals:

public slots:
    void slot_checkAll(int status);  //全选
    void slot_delteTrust();  //移除信任
    void slot_tCheckItem();   //table表的单选

private:
    QCheckBox *m_checkBoxAll;     //全选框
    QPushButton  *m_pBLog;      //移除隔离按钮
    QStandardItemModel *m_itemmodel;
    QTableView *m_tableView;
};

#endif // NATIAVISOLATIONDILOG_H

NatiavIsolationDilog .cpp

#include "natiavisolationdilog.h"

#include <QDebug>
#include <QTime>
#include <QHeaderView>

NatiavIsolationDilog::NatiavIsolationDilog(QWidget *parent)
    : QWidget(parent)
{
    this->resize(520, 520);
    this->setMinimumSize(QSize(520, 520));
    this->setMaximumSize(QSize(520, 520));

    m_checkBoxAll = new QCheckBox(this);    //全选
    m_pBLog = new QPushButton(this);   //按钮
    m_itemmodel = new  QStandardItemModel;
    initGUI(); //界面初始化

    //全选开启三态
    m_checkBoxAll->setCheckState(Qt::CheckState::PartiallyChecked);
    m_checkBoxAll->setCheckState(Qt::CheckState::Unchecked);  //设置全选初始
    connect(m_checkBoxAll, &QCheckBox::stateChanged, this, &NatiavIsolationDilog::slot_checkAll);
    connect(m_pBLog, &QPushButton::clicked, this, &NatiavIsolationDilog::slot_delteTrust);

    loadData();  //加载数据
}

void NatiavIsolationDilog::initGUI()
{
    QVBoxLayout *mainlayout=new  QVBoxLayout(this);   //主布局
    mainlayout->setContentsMargins(20,0,20,0);      //边距离
    QLabel *label_title = new QLabel(tr("隔离区"));   //标题
    label_title->setAlignment(Qt::AlignCenter);
    mainlayout->addWidget(label_title);

    //tableview
    QWidget *CenterWidget = new QWidget;
    CenterWidget->setFixedHeight(400);
    CenterWidget->setMinimumWidth(473);
    CenterWidget->setLayout(initTableWidget());
    mainlayout->addWidget(CenterWidget,Qt::AlignBottom | Qt::AlignHCenter);

    //全选框
    m_checkBoxAll->setText(tr("全选"));
    mainlayout->addWidget(m_checkBoxAll);

    // 按钮
    QWidget *horizontalWidget = new QWidget;
    QHBoxLayout  *horizontalLayout = new QHBoxLayout();
    QSpacerItem *horizontalSpacer_2 = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
    horizontalLayout->addItem(horizontalSpacer_2);
    m_pBLog->setText(tr("删除隔离"));
    m_pBLog->setMinimumSize(QSize(140, 36));
    m_pBLog->setMaximumSize(QSize(140, 37));
    horizontalLayout->addWidget(m_pBLog);
    QSpacerItem   *horizontalSpacer = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
    horizontalLayout->addItem(horizontalSpacer);
    horizontalWidget->setLayout(horizontalLayout);
    mainlayout->addWidget(horizontalWidget);
}


 //初始化中间tableview布局
QHBoxLayout *NatiavIsolationDilog::initTableWidget()
{
    QHBoxLayout *layout = new QHBoxLayout;
    layout->setMargin(0);
    layout->setSpacing(0);

    //行高   列头去掉
    m_tableView = new QTableView;
    m_tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
    m_tableView->setSelectionMode(QAbstractItemView::NoSelection);  //单选
    m_tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);   //不可以编辑
    m_tableView->setFrameShape(QTableView::NoFrame);   //形状
    m_tableView->setShowGrid(false);   //栅格
    m_tableView->setSortingEnabled(true);   //排序
    m_itemmodel->clear();
    m_tableView->verticalHeader()->setVisible(false);
    m_tableView->verticalHeader()->setDefaultSectionSize(60);

    // 连接表格与模型
    m_tableView->setModel(m_itemmodel);

    //item项
    QStandardItem *standaritem0 = new QStandardItem(tr("隔离文件"));
    standaritem0->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);
    QStandardItem *standaritem1 = new QStandardItem(tr("添加时间"));
    standaritem1->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);

    m_itemmodel->setHorizontalHeaderItem(0, standaritem0);
    m_itemmodel->setHorizontalHeaderItem(1, standaritem1);
    m_tableView->setColumnWidth(0, 340);
    m_tableView->setColumnWidth(1, 136);

    layout->addWidget(m_tableView);
    return layout;
}

void NatiavIsolationDilog::loadData()
{
    for (int i = 0; i < 5; i++) {
        QList<QStandardItem *> itemLst;
        QStandardItem *item1 = new QStandardItem;
        QStandardItem *item2 = new QStandardItem;
        itemLst << item1 << item2;

        m_itemmodel->appendRow(itemLst);
        QWidget *pwidget= new QWidget;
        QHBoxLayout *hlayout=new QHBoxLayout;
        hlayout->setAlignment(Qt::AlignLeft);
        QVBoxLayout *vlayout=new QVBoxLayout;
        QCheckBox *chebox = new QCheckBox;
        chebox->setObjectName("singleCheck");
        hlayout->addWidget(chebox);
  //      addSpacing(10);
        QLabel *f_name = new QLabel(tr("文件名%1").arg(i));   //文件名
        QLabel *f_path = new QLabel(tr("文件路径"));   //文件名
        vlayout->addWidget(f_name);
        vlayout->addWidget(f_path);
        hlayout->addLayout(vlayout);
        pwidget->setLayout(hlayout);

        connect(chebox, &QCheckBox::clicked, this, &NatiavIsolationDilog::slot_tCheckItem);
        m_tableView->setIndexWidget(m_itemmodel->index(i, 0), pwidget);
        m_itemmodel->setItem(i, 1, new QStandardItem(QString(tr("时间"))));
    }
}

//自适应
void NatiavIsolationDilog::resizeEvent(QResizeEvent *event)
{
    Q_UNUSED(event);
    int height = m_tableView->indexWidget(m_itemmodel->index(0, 0))->size().height();
    for (int i = 0; i < m_itemmodel->rowCount(); i++) {
        m_tableView->setRowHeight(i, height);
    }
}

//全选
void NatiavIsolationDilog::slot_checkAll(int status)
{
    int count=m_itemmodel->rowCount();
    for(int i=0;i<count;i++)
    {
        QWidget *widget= m_tableView->indexWidget(m_itemmodel->index(i,0));
        QCheckBox *check =widget->findChild<QCheckBox *>("singleCheck");
        switch (status) {
        case 0:
            check->setCheckState(Qt::CheckState::Unchecked);
            break;
        case 1:
            //check->setCheckState(Qt::CheckState::PartiallyChecked);
            break;
        case 2:
            check->setCheckState(Qt::CheckState::Checked);
            break;
        }
    }
}

//删除隔离
void NatiavIsolationDilog::slot_delteTrust()
{
    int count=m_itemmodel->rowCount();   //总行数
    QMap<int, int> rowMap;    //选中状态的map
    for(int i=0;i<count;i++){
        QWidget *widget= m_tableView->indexWidget(m_itemmodel->index(i,0));
        QCheckBox *check =widget->findChild<QCheckBox *>("singleCheck");
        int status=check->checkState();    //按钮的状态
        switch (status) {
            case 0:
            rowMap.insert(i,0);
            break;
        case 1:
            break;
        case 2:
            rowMap.insert(i,1);    //如果是选中状态移除
            break;
        }
    }
    int key;
    int value;
    QMapIterator<int, int> rowMapIterator(rowMap);
    rowMapIterator.toBack();
    while (rowMapIterator.hasPrevious())
    {
        rowMapIterator.previous();
        key = rowMapIterator.key();
        value=rowMapIterator.value();
        if(value==1){
            m_itemmodel->removeRow(key);
        }
    }
}

//table 单选对象
void NatiavIsolationDilog::slot_tCheckItem()
{
    int count=m_itemmodel->rowCount();   //总行数
    QMap<int, int> rowMap;    //选中状态的map
    for(int i=0;i<count;i++){
        QWidget *widget= m_tableView->indexWidget(m_itemmodel->index(i,0));
        QCheckBox *check =widget->findChild<QCheckBox *>("singleCheck");
        int status=check->checkState();    //按钮的状态
        switch (status) {
            case 0:
            rowMap.insert(i,0);
            break;
        case 1:
            break;
        case 2:
            rowMap.insert(i,1);    //如果是选中状态移除
            break;
        }
    }

    int tcount=0;   //打沟的数量
    int fcount=0;   //不打沟的数量
    QMapIterator<int, int> rowMapIterator(rowMap);
    rowMapIterator.toBack();
    while (rowMapIterator.hasPrevious())
    {
        int value;
        rowMapIterator.previous();
        value = rowMapIterator.value();
        if(value==0){
            fcount++;
        }else if(value==1){
            tcount++;
        }
    }

    //根据数量判断  全选状态
    if(tcount==count){
        m_checkBoxAll->setCheckState(Qt::CheckState::Checked);
    }else if (fcount==count) {
        m_checkBoxAll->setCheckState(Qt::CheckState::Unchecked);
    }else {
        m_checkBoxAll->setCheckState(Qt::CheckState::PartiallyChecked);
    }
}

man.cpp

#include <QApplication>
#include "natiavisolationdilog.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    NatiavIsolationDilog dialog;
    dialog.show();

    return a.exec();
}

最后效果图
依次点击table表中的checkbox 看全选的变化
在这里插入图片描述
在这里插入图片描述
选择三个要删除的行,点击删除,
在这里插入图片描述
在这里插入图片描述

### 回答1: QTableView 是一个显示表格数据的控件,它提供了一种在界面上展示数据的方式,可以方便地查看编辑表格数据。 QCheckBox 是一个单选框控件,它提供了一种选择或取消选择某个选项的方式。当需要用户在多个选项中进行单选操作时,可以使用 QCheckBox 控件来增加用户的交互体验。 在使用 QTableView QCheckBox 控件时,可以将 QCheckBox 添加QTableView 的某一列中的每一个单元格中,用来标识该行数据是否被选中。这样就可以实现在表格中选择或取消选择某些特定的行数据。 当用户点击某个 QCheckBox 控件时,可以通过信号槽机制来捕捉到 QCheckBox 被选中或取消选中的事件,然后根据事件来改变 QTableView 中相应行数据的状态。 除此之外,还可以通过通过编程的方式操作 QCheckBox 控件,例如通过代码设置某一行的 QCheckBox 控件为选中状态或取消选中状态,或者获取某一行 QCheckBox 控件的状态来进行相关的处理。 总之,使用 QTableView QCheckBox 控件可以方便地对表格数据进行展示选择操作,提供了一种方便快捷的方式来处理表格数据。 ### 回答2: QTableView是一个表格视图,它是Qt中数据展示的一种常用方式。它可以显示一张表格,其中包含了行列的数据。 QCheckbox是一个复选框,它是Qt中常用的一种控件。它可以同时显示未选中选中两种状态,且可以通过用户的操作来切换状态。 当我们将这两个控件结合使用时,可以实现一些有趣的功能。 例如,我们可以在QTableView中的某一列中插入QCheckbox,这样每一行都会有一个复选框。用户可以通过勾选或取消勾选这些复选框来选择其中的某些行。 此外,我们还可以编写代码来实现全选或全不选的功能。比如,当用户点击一个全选的复选框时,所有的行的复选框都会变为选中状态,当用户取消勾选全选的复选框时,所有的行的复选框都会变为未选中状态。 我们还可以在QTableView中使用QCheckbox来控制一些与数据相关的操作。比如,当用户勾选某个复选框时,可以执行某个特定的操作,比如删除该行的数据。 综上所述,QTableViewQCheckbox是两个常用的Qt控件,结合使用可以实现很多有用的功能。在开发Qt应用程序时,我们可以根据具体需求来使用它们,提供更好的用户体验。 ### 回答3: QTableViewQCheckBox是Qt框架中常用的两个控件。 QTableView是一个表格视图控件,用于显示二维数据。通过QTableView,可以将数据以表格的形式展示出来,支持对数据进行排序、筛选、编辑等操作。QTableView可以根据需要自定义表头、行数、列数、单元格内容格式等。同时,还可以通过设置不同的选择模式,实现单选、多选或无选择的功能。 QCheckBox则是一个复选框控件,用于表示二选一或多选一的状态。通过QCheckBox,用户可以在多个选项中进行选择,可以通过勾选或取消勾选的方式改变其状态。QCheckBox可以设置默认状态、选中状态、禁用状态等,且可以通过信号槽机制,实现对状态变化的响应。 在使用QTableView时,可以将QCheckBox作为一个自定义的编辑控件嵌入到表格中的某一列,用于表示某个特定的列为复选框的选择状态。例如,在一个任务列表中,可以将某一列设为复选框,用于选择是否完成相应的任务。这样,用户可以通过对复选框进行勾选或取消勾选的操作来改变任务的完成状态。 总而言之,QTableViewQCheckBox是Qt框架中十分有用的两个控件。通过QTableView,可以轻松地展示处理二维数据,而QCheckBox则为用户提供了一种方便的选择控制状态的方式。它们的结合使用,可以帮助我们开发出更加灵活交互性的应用程序。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值