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

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

Я создал свой класс 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); }

person jm.    schedule 04.07.2014    source источник
comment
Можете ли вы вставить фрагмент кода вашего делегата? Просто отредактируйте свой вопрос и поместите его там.   -  person Googie    schedule 04.07.2014


Ответы (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);
}
person vahancho    schedule 04.07.2014
comment
Я хочу обновить список по другим индексам, а не только по одному элементу:/ - person jm.; 04.07.2014
comment
@ user2852500, хорошо, но вы можете сделать то же самое для нескольких индексов. На самом деле, вы можете делать почти все со своей таблицей в FillComboBox::setModelData(). - person vahancho; 04.07.2014
comment
Я могу изменить список редактора других элементов? - person jm.; 04.07.2014
comment
@user2852500, что значит список редактора? Вы имеете в виду поле со списком? Вы можете сделать это, когда откроете раскрывающийся список. Вы не можете открыть два раскрывающихся списка одновременно. - person vahancho; 04.07.2014
comment
да. В начале каждый ComboBox имеет список значений, которые он показывает, и я хочу изменить список других полей со списком, поскольку выбор одного поля со списком изменен. Я не хочу открывать два поля со списком одновременно, но если пользователь выбирает что-то в первом поле со списком, то при открытии второго поля со списком значения в этом раскрывающемся списке будут другими. - person jm.; 04.07.2014