Как получить статус жестко закодированных QCheckBoxes в QSqlQueryModel?

У меня есть 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, где установлен соседний флажок.

Как это сделать?

1 ответ

Использование 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,

Другие вопросы по тегам