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 看全选的变化
选择三个要删除的行,点击删除,