Qt - Запуск события, когда изменяется выбор делегата абстрактного элемента.

Я пытаюсь сделать табличное представление со строкой, которая имеет отдельный раскрывающийся список для каждого столбца. Пользователь может выбрать только комбинацию значений. То есть, если пользователь выбирает "А" из первого раскрывающегося списка, значения в других раскрывающихся списках должны быть обновлены до значения, которое может соответствовать "А".

Я сделал свой класс AbsractItemDelegate и значения назначаются в порядке. Но я застрял в том, как я могу вызвать событие, когда значение изменяется в одном из раскрывающихся списков.

Благодарю.

Ниже приведена моя реализация класса делегата:

FillComboBox::FillComboBox(QStringList the_list) : QItemDelegate() {
//list = new QStringList();
list = the_list; }

QWidget* FillComboBox::createEditor(QWidget* parent,
const QStyleOptionViewItem& /* option */,
const QModelIndex& /* index */) const {
QComboBox* editor = new QComboBox(parent);
editor->addItems(list);
editor->setCurrentIndex(2);
return editor; }


void FillComboBox::setEditorData(QWidget* editor,
const QModelIndex &index) const {
QString text = index.model()->data(index, Qt::EditRole).toString();
QComboBox* combo_box = dynamic_cast<QComboBox*>(editor);
combo_box->setCurrentIndex(combo_box->findText(text)); }


void FillComboBox::setModelData(QWidget* editor, QAbstractItemModel* model,
const QModelIndex &index) const {
QComboBox* combo_box = dynamic_cast<QComboBox*>(editor);
QString text = combo_box->currentText();
model->setData(index, text, Qt::EditRole); }

void FillComboBox::updateEditorGeometry(QWidget* editor,
const QStyleOptionViewItem &option, const QModelIndex &/* index */) const {
editor->setGeometry(option.rect); }

1 ответ

Вы можете обновить данные "другого" элемента, как только данные текущего элемента обновляются, т.е. FillComboBox::setModelData(), Пожалуйста, найдите псевдокод, который реализует желаемое поведение (см. Комментарии):

void FillComboBox::setModelData(QWidget* editor, QAbstractItemModel* model,
                                const QModelIndex &index) const
{
    QComboBox* combo_box = dynamic_cast<QComboBox*>(editor);
    QString text = combo_box->currentText();
    model->setData(index, text, Qt::EditRole);

    // Find the model index of the item that should be changed and its data too
    int otherRow = ...; // find the row of the "other" item
    int otherColumn = ...; // find the column of the "other" item
    QModelIndex otherIndex = model->index(otherRow, otherColumn);
    QString newText = text + "_new";
    // Update other item too
    model->setData(otherIndex, newText, Qt::EditRole);
}
Другие вопросы по тегам