tableview添加checkbox文章来源:https://www.toymoban.com/news/detail-773541.html
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
, model(new QStandardItemModel(this))
{
QLoggingCategory::defaultCategory()->setEnabled(QtDebugMsg, true);
ui->setupUi(this);
ui->tableView->setModel(model);
auto nRowCount = 10;
auto nColCount = 3;
ui->tableView->setShowGrid(false);
for(auto nRowIndex = 0; nRowIndex < nRowCount; ++nRowIndex)
{
ExperiTemplateItem templateItem;
QString qsText = QString("checkbox%1").arg(nRowIndex);
templateItem.wgt = new QWidget;
templateItem.checkbox = new QCheckBox(templateItem.wgt);
templateItem.hlayout = new QHBoxLayout;
templateItem.checkbox->setStyleSheet(tr("QCheckBox::indicator{width:15px;height:15px;}"));
templateItem.hlayout->addWidget(templateItem.checkbox);
templateItem.hlayout->setAlignment(Qt::AlignCenter);
templateItem.hlayout->setContentsMargins(0,0,0,0);
templateItem.wgt->setLayout(templateItem.hlayout);
templateItem.checkitem = new QStandardItem;
model->setItem(nRowIndex, 0, templateItem.checkitem);
auto modelIndex = model->index(nRowIndex, 0);
ui->tableView->setIndexWidget(modelIndex, templateItem.wgt);
qsText = QString("abcdefg1");
templateItem.experimentTemplate = new QStandardItem(qsText);
model->setItem(nRowIndex, 1, templateItem.experimentTemplate);
templateItem.fromUser = new QStandardItem(qsText);
model->setItem(nRowIndex, 2, templateItem.fromUser);
ui->tableView->setRowHeight(nRowIndex, 50);
list.push_back(templateItem);
}
ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
ui->tableView->setAlternatingRowColors(true);
ui->tableView->setStyleSheet("alternate-background-color:rgb(176,224,230);background-color:rgb(255,255,255)");
ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
ui->tableView->horizontalHeader()->setVisible(false);
ui->tableView->verticalHeader()->setVisible(false);
QScroller *pScroller = QScroller::scroller(ui->tableView);
pScroller->grabGesture(ui->tableView,QScroller::LeftMouseButtonGesture);
ui->tableView->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
}
单行删除相对来说比较容易,多行删除就比较麻烦了,要从最后一行往前删,不然会出现删错行的问题。文章来源地址https://www.toymoban.com/news/detail-773541.html
void MainWindow::on_pushButton_clicked(bool checked)
{
int count = 0;
for(ExperiTemplateItem x : list)
{
if(x.checkbox->isChecked())
{
count++;
}
}
while(count > 0)
{
QList<ExperiTemplateItem>::reverse_iterator rit;
for(rit = list.rbegin(); rit != list.rend(); ++rit)
{
//找到标的行号 必须从最后一行 往前删除 不然会打乱顺序
if(rit->checkbox->isChecked())
{
QModelIndex index = ui->tableView->indexAt(rit->wgt->pos());
rit->wgt->close();
delete rit->fromUser;
delete rit->experimentTemplate;
delete rit->checkitem;
delete rit->hlayout;
delete rit->checkbox;
delete rit->wgt;
model->removeRow(index.row());
/*
反向迭代器删除元素
所有的 erase 函数都只接受正向迭代器 iterator,所以如果想在反向遍历删除元素时必须
要将 reverse_iterator 转换为 iterator 后再执行 erase 操作,所以反向迭代器与正向
迭代器相差 1 的这个细节在这里必须要考虑清楚。比如按上图 ri 指向元素 3,但转换为正
向迭代器后实际为指向元素 4 的位置,为了能正确执行删除,必须先将反向迭代器前进 1 步
再转为正向迭代器。
*/
list.erase((++rit).base());//转为正向迭代器
count--;
break;
}
}
}
qDebug("rows:%d\n", list.size());
}
到了这里,关于如何对qtableview上的数据进行多选及多行删除的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!