2015-12-20 4 views
0

У меня есть QTableView, который показывает QSqlQueryModel. Модель содержит флажки, которые создаются в каждой строке в первом столбце (которые содержат ref_no, первичный ключ в моем дб) следующим образом:Как получить статус жестко закодированных QCheckBoxes в QSqlQueryModel?

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 (или ad hoc решение, использующее картографию с использованием 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. Вместо этого используйте proxy model, который обогащает вашу колонку, возвращая флаг Qt::ItemIsUserCheckable и обрабатывает операции чтения и записи для Qt::CheckStateRole.

 Смежные вопросы

  • Нет связанных вопросов^_^