#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. Ладно, понял. С вашими дополнительными комментариями ваше решение имеет смысл.