как я могу определить, когда флажок изменен в qcombobox

#qt

Вопрос:

У меня есть QComboBox с элементами, где у них есть флажок (с помощью QStandardItem и item->Установить флажок(true))

Как я могу определить, когда один из элементов изменил значение флажка?

Комментарии:

1. if(checkbox->checkState() == Qt::Unchecked)

Ответ №1:

Чтобы наблюдать checkState за предметом, вы должны наблюдать за моделью, но не QComboBox . Для этого вы можете подключиться к сигналу QStandardItemModel::itemChanged и искать любые изменения. Но дело здесь itemChanged не только в том, что сигнал излучается для любых изменений checkState . Если вы ищете только checkState изменения, вам нужно сохранить состояние последней проверки и сравнить его с текущим состоянием при получении itemChanged сигнала. Для этой цели вы можете использовать роль пользователя элемента. Пример:

 //create model
QStandardItemModel *model = new QStandardItemModel(4, 1, this);
for (int row = 0; row < model->rowCount();   row)
{
    for (int column = 0; column < model->columnCount();   column)
    {
        QStandardItem *item = new QStandardItem(QString("row %0, column %1").arg(row).arg(column));
        item->setCheckable(true);
        item->setData(Qt::Unchecked, Qt::UserRole   1); //initial set of last state
        model->setItem(row, column, item);
    }
}

ui->comboBox->setModel(model);
ui->comboBox->setModelColumn(0);

//detect checkState changes
connect(model, QStandardItemModel::itemChanged, this, [this](QStandardItem *item)
{
    if (item->checkState() != item->data(Qt::UserRole   1).value<Qt::CheckState>()) //last and current state are different
    {
        qDebug() << "Checked changed. " << item->checkState();
        item->setData(item->checkState(), Qt::UserRole   1);  // update last state
    }
});
 

Комментарии:

1. Предоставленный код не компилируется. Используйте amp;QStandardItemModel::itemChanged в вызове connect() . Однако я не думаю, что решение работает, потому что выбор элемента не изменит его данные и, следовательно QStandardItemModel::itemChanged , не будет выдан. Вы можете подключиться к amp;QComboBox::activated или amp;QComboBox::currentIndexChanged и сопоставить индекс с базовым элементом модели, а затем изменить/переключить состояние проверки элемента в соответствии с вашими требованиями.

2. @MathiasSchmid Насчет компиляции вы должны быть правы, но по какой-то причине в моем случае построение идет хорошо. Я не уверен, почему это так, этого не должно быть. Об изменении данных элемента: Вы не спрашиваете, как изменить данные, QComboBox поэтому я предположил, что вы уже реализовали это. Поэтому мой ответ касается только обнаружения изменений данных, но не того, как их изменять. Извините за недопонимание. Может быть, вам нужно прояснить свой вопрос.

3. @MathiasSchmid На самом деле для тестирования я установил модель как для выпадающего списка, так и для таблицы (таблица для редактирования и выпадающий список для отображения). Я старался избегать редактирования выпадающего списка состояния проверки элементов, потому что думал, что это выходит за рамки вашего вопроса.

4. Ладно, понял. С вашими дополнительными комментариями ваше решение имеет смысл.