我有一个显示QSqlQueryModel
的QTableView
。该模型包含在第一列的每一行中创建的复选框(其中包含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。
如何做到这一点?
使用QSignalMapper
(或涉及使用sender()
或lambdas的映射器的特殊解决方案)。例如,定义映射的成员:
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
}
或者,如果你喜欢lambdas,你可以通过捕捉来完成以上操作:
connect(checkBox, &QCheckBox::toggled,
[i](bool toggled){ /* use i, toggled */ });
话虽如此,我强烈建议不要创建QCheckBoxes
并使用setIndexWidget
相反,使用一个代理模型,通过返回Qt::ItemIsUserCheckable
标志来丰富您的列,并处理Qt::CheckStateRole
的读写操作。