访问Qtableview中的复选框

时间:2017-11-21 11:11:39

标签: c++ qt

我是Qt的新用户,我尝试使用QCheckboxQTableView添加SetIndexWidget()列,如下所示:

QSqlQueryModel * model = new QSqlQueryModel();

model->setQuery("select * from Rendezvous");
model->insertColumn(0);
model->setHeaderData(0, Qt::Horizontal, QObject::tr(""));
model->setHeaderData(1, Qt::Horizontal, QObject::tr("ID"));
model->setHeaderData(2, Qt::Horizontal, QObject::tr("Date"));
model->setHeaderData(3, Qt::Horizontal, QObject::tr("Heure"));
model->setHeaderData(4, Qt::Horizontal, QObject::tr("Type"));
model->setHeaderData(5, Qt::Horizontal, QObject::tr("Description"));
model->setHeaderData(6, Qt::Horizontal, QObject::tr("ID Client"));
ui->tableView_RDV->setModel(model);
ui->tableView_RDV->resizeColumnToContents(0);
for(int p=0;p<model->rowCount();p++)
{
    ui->tableView_RDV->setIndexWidget(model->index(p,0),new QCheckBox());
}

这会在我的表格中添加一个复选框,我可以与它互动,但我不知道如何检查QTableView中的哪些行已检查QCheckboxe s。

我很欣赏如何做到这一点。

2 个答案:

答案 0 :(得分:0)

以下代码段可能会对您有所帮助:

for(int p=0;p<model->rowCount();p++)
{
    QCheckBox* tmp = qobject_cast<QCheckBox*>(ui->tableView_RDV->indexWidget(model->index(p,0)));
    if(tmp != NULL && tmp.isChecked())
    {
        //Do what you wants when it is checked
    }
}

<强>已更新
Dmitry Sazonov 的评论和Qt Forum

提供的信息后使用qobject_cast代替dynamic_cast

答案 1 :(得分:0)

您应该使用Qt::CheckStateRole来显示复选框。它更快,并且对应于Qt MVC:

for(int p=0;p<model->rowCount();p++)
{
    auto checked = SomeLogic ? Qt::Checked : Qt::Unchecked;
    auto index = model->index( p, 0 );
    model->setData( index, checked, Qt::CheckStateRole );
}

注意:仅当您指定Qt::CheckStateRole非空值时,才会显示复选框。如果您将其设置为空QVariant(),则不会显示复选框。