0

我有一个QTableView显示QSqlQueryModel。该模型包含在第一列的每一行中创建的复选框(其中包含 ref_no;我的数据库中的主键),如下所示:

void MainWindow::showM(model){
    ui->tableView->setModel(model);
    ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
    for( int i = 0; p<model->rowCount(); i++)
    {
        QCheckBox *checkBox = new QCheckBox();
        ui->tableView->setIndexWidget(model->index(i,0),checkBox);
    }
    ui->tableView->show();
}

...它工作正常,显示我需要的所有信息以及复选框。

现在,我需要获取选中相邻复选框的 ref_no 。

怎么做 ?

4

1 回答 1

1

使用(或涉及使用或 lambdasQSignalMapper的映射器的临时解决方案)。sender()例如为映射定义一个成员:

QHash<QCheckBox *, int> m_mapping;

然后在你的代码中像这样连接它:

QCheckBox *checkBox = new QCheckBox();
ui->tableView->setIndexWidget(model->index(i,0),checkBox);
m_mapping[checkBox] = i;
connect(checkBox, &QCheckBox::toggled, this, &MainWindow::onCheckBoxToggled);

然后像这样定义一个插槽:

// for the love of kittens use proper names for methods
void MyWindow::onCheckBoxToggled(bool toggled) {
    QCheckBox *box = static_cast<QCheckBox *>(sender());
    const int id = m_mapping.value(box);
    // do something
}

或者,如果您喜欢 lambda,您可以通过捕获来执行上述操作:

connect(checkBox, &QCheckBox::toggled, 
        [i](bool toggled){ /* use i, toggled */ });

话虽如此,我强烈反对创建QCheckBoxes和使用setIndexWidget. 相反,使用代理模型,通过返回Qt::ItemIsUserCheckable标志和处理Qt::CheckStateRole.

于 2015-12-21T00:10:27.153 回答