0

I have a combobox with multiple checkbox items and I need to be able to iterate through them and determine if they are checked or even more appropriately, as soon as an item is checked, have an event fire off but I can't seem to get the signal/slot combo working correctly.

Here is some of my code:

void MainWindow::setupQueryBuilder(Ui::MainWindow* ui)
{
    QStandardItemModel* assessmentModel = new QStandardItemModel(3, 1);
    QStandardItem* assessmentPleaseSelect = new QStandardItem();
    QStandardItem* assessmentVisionScreening = new QStandardItem();
    QStandardItem* assessmentHearingAssessment = new QStandardItem();
    QStandardItem* assessmentDevelopmentalAssessment = new QStandardItem();

    assessmentPleaseSelect->setText("Please Select...");
    assessmentPleaseSelect->setFlags(Qt::ItemIsEnabled);
    assessmentPleaseSelect->setData(Qt::CheckStateRole);

    assessmentVisionScreening->setText("Vision Screening");
    assessmentVisionScreening->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled);
    assessmentVisionScreening->setData(Qt::Unchecked, Qt::CheckStateRole);

    assessmentHearingAssessment->setText("Hearing Assessment");
    assessmentHearingAssessment->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled);
    assessmentHearingAssessment->setData(Qt::Unchecked, Qt::CheckStateRole);

    assessmentDevelopmentalAssessment->setText("Developmental Assessment");
    assessmentDevelopmentalAssessment->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled);
    assessmentDevelopmentalAssessment->setData(Qt::Unchecked, Qt::CheckStateRole);

    assessmentModel->insertRow(0, assessmentPleaseSelect);
    assessmentModel->insertRow(1, assessmentVisionScreening);
    assessmentModel->insertRow(2, assessmentHearingAssessment);
    assessmentModel->insertRow(3, assessmentDevelopmentalAssessment);

    ui->SearchAssessmentSelect->setModel(assessmentModel);
}
Jarrod Cabalzar
  • 408
  • 1
  • 5
  • 24
  • Have you tried connecting to this signal: void QAbstractItemModel::dataChanged(const QModelIndex & topLeft, const QModelIndex & bottomRight, const QVector & roles = QVector ()) ? – TheDarkKnight Aug 20 '13 at 07:43
  • What signal did you try connecting, and to which slot did you try connecting it to? – thuga Aug 20 '13 at 08:22
  • I tried to follow this but I couldn't get it to work: "It is even easier than that :). Without any subclassing necessary: connect(this->Model, SIGNAL(dataChanged ( const QModelIndex&, const QModelIndex&)), this, SLOT(slot_changed())); with: void MainWindow::slot_changed() { std::cout << "highlighted." << std::endl; if(this->Item->checkState() == Qt::Unchecked) { std::cout << "Unchecked!" << std::endl; } else if(this->Item->checkState() == Qt::Checked) { std::cout << "Checked!" << std::endl; } } – David Doria Dec 8 '11 at 12:34" – Jarrod Cabalzar Aug 20 '13 at 09:25

1 Answers1

2

I've not tried this, but from looking at the docs you have a signal for QStandardItemModel called itemChanged(QStandardItem *item). What you'd want to do is created a slot named (for example) modelItemChanged(QStandardItem *item) and connect them with connect(assessmentModel, SIGNAL(itemChanged(QStandardItem *)), this, SLOT(modelItemChanged(QStandardItem *))).

That should set your model to trigger the slot whenever an QStandardItem is changed, and it'll pass a pointer to the item that was changed. In your modelItemChanged(QStandardItem *item) function you can then query the QStandardItem *item to see what state it is in.

Nicholas Smith
  • 11,642
  • 6
  • 37
  • 55