у меня есть 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, где установлен соседний флажок.
Как это сделать ?
использование QSignalMapper
(или специальное решение с использованием картографа с использованием 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
}
Или, если вам нравятся лямбды, вы можете сделать это с помощью захвата:
connect(checkBox, &QCheckBox::toggled,
[i](bool toggled){ /* use i, toggled */ });
Все это, сказав, Я настоятельно рекомендую против идеи создания QCheckBoxes
и используя setIndexWidget
, Вместо этого используйте модель прокси что обогащает ваш столбец, возвращая Qt::ItemIsUserCheckable
флаг и обрабатывает читает и пишет для Qt::CheckStateRole
,
Других решений пока нет …