Сообщение Не сохраняется изменение, внесенное с помощью делегата от 03.06.2020 13:48
Изменено 03.06.2020 13:51 arfaa
Не сохраняется изменение, внесенное с помощью делегата
Добрый день, проблема в том, что в нужном месте отрисовываю QCombobox(dj dnjhjq rjkjyrt), состоящий из итемов A,B,C,D выбираю из него символ , к примеру С, но после entera или смене фокуса значение не сохраняется, ниже приведу код, который по-моему влияет на сохранение и изменение:
Model:
Delegate:
подскажите, что нужно еще прописать, чтобы сохранялось значение, выбранное в QComboBox,спасибо
Model:
Qt::ItemFlags MetricTypesModel::flags(const QModelIndex& index) const
{
if (!index.isValid())
return Qt::NoItemFlags;
Qt::ItemFlags theFlags = QAbstractItemModel::flags(index);
MetricTypesItem* Item = static_cast<MetricTypesItem*>(index.internalPointer());
if (index.column() == 2 && Item->childCount() == 0)
{
theFlags = Qt::ItemIsEnabled | Qt::ItemIsDropEnabled | Qt::ItemIsDragEnabled | Qt::ItemIsEditable;
//theFlags |= Qt::ItemIsUserCheckable;
}
if (index.column() == 1 && Item->childCount() > 0)
{
theFlags = Qt::ItemIsSelectable;
theFlags |= Qt::ItemIsUserCheckable;
}
return theFlags;
}
bool MetricTypesModel::setData(const QModelIndex& index, const QVariant& value, int role)
{
if (index.isValid() && role == Qt::EditRole)
{
MetricTypesItem* Item = static_cast<MetricTypesItem*>(index.internalPointer());
Item->setData(value,Qt::DisplayRole);
emit dataChanged(index, index);
return true;
}
return false;
}
QVariant MetricTypesModel::data(const QModelIndex& index, int role) const
{
if (!index.isValid())
return QVariant();
MetricTypesItem* item = static_cast<MetricTypesItem*>(index.internalPointer());
if (role == Qt::CheckStateRole && index.column() == 1 && item->childCount() > 0)
return static_cast<int>(item->isChecked() ? Qt::Checked : Qt::Unchecked);
if (role == Qt::CheckStateRole && index.column() == 6 && item->childCount() == 0)
return static_cast<int>(item->isChecked() ? Qt::Checked : Qt::Unchecked);
if (role == Qt::DisplayRole)
{
QString str = item->data(index.column()).toString();
return item->data(index.column());
}
return QVariant();
}
Delegate:
void MetricTypesDelegate::setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const
{
QComboBox* comboBox = static_cast<QComboBox*>(editor);
QString value = comboBox->currentText();
model->blockSignals(true);
model->setData(index, value, Qt::EditRole);
model->blockSignals(false);
model->setData(index, comboBox->itemData(comboBox->currentIndex()), Qt::UserRole + 1);
}
подскажите, что нужно еще прописать, чтобы сохранялось значение, выбранное в QComboBox,спасибо
Не сохраняется изменение, внесенное с помощью делегата
Добрый день, проблема в том, что в нужном месте отрисовываю QCombobox(во втором столбце), состоящий из итемов A,B,C,D выбираю из него символ , к примеру С, но после entera или смене фокуса значение не сохраняется, ниже приведу код, который по-моему влияет на сохранение и изменение:
Model:
Delegate:
подскажите, что нужно еще прописать, чтобы сохранялось значение, выбранное в QComboBox,спасибо
Model:
Qt::ItemFlags MetricTypesModel::flags(const QModelIndex& index) const
{
if (!index.isValid())
return Qt::NoItemFlags;
Qt::ItemFlags theFlags = QAbstractItemModel::flags(index);
MetricTypesItem* Item = static_cast<MetricTypesItem*>(index.internalPointer());
if (index.column() == 2 && Item->childCount() == 0)
{
theFlags = Qt::ItemIsEnabled | Qt::ItemIsDropEnabled | Qt::ItemIsDragEnabled | Qt::ItemIsEditable;
//theFlags |= Qt::ItemIsUserCheckable;
}
if (index.column() == 1 && Item->childCount() > 0)
{
theFlags = Qt::ItemIsSelectable;
theFlags |= Qt::ItemIsUserCheckable;
}
return theFlags;
}
bool MetricTypesModel::setData(const QModelIndex& index, const QVariant& value, int role)
{
if (index.isValid() && role == Qt::EditRole)
{
MetricTypesItem* Item = static_cast<MetricTypesItem*>(index.internalPointer());
Item->setData(value,Qt::DisplayRole);
emit dataChanged(index, index);
return true;
}
return false;
}
QVariant MetricTypesModel::data(const QModelIndex& index, int role) const
{
if (!index.isValid())
return QVariant();
MetricTypesItem* item = static_cast<MetricTypesItem*>(index.internalPointer());
if (role == Qt::CheckStateRole && index.column() == 1 && item->childCount() > 0)
return static_cast<int>(item->isChecked() ? Qt::Checked : Qt::Unchecked);
if (role == Qt::CheckStateRole && index.column() == 6 && item->childCount() == 0)
return static_cast<int>(item->isChecked() ? Qt::Checked : Qt::Unchecked);
if (role == Qt::DisplayRole)
{
QString str = item->data(index.column()).toString();
return item->data(index.column());
}
return QVariant();
}
Delegate:
void MetricTypesDelegate::setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const
{
QComboBox* comboBox = static_cast<QComboBox*>(editor);
QString value = comboBox->currentText();
model->blockSignals(true);
model->setData(index, value, Qt::EditRole);
model->blockSignals(false);
model->setData(index, comboBox->itemData(comboBox->currentIndex()), Qt::UserRole + 1);
}
подскажите, что нужно еще прописать, чтобы сохранялось значение, выбранное в QComboBox,спасибо