Изменение данных в QTableView в зависимости от выбора QComboBox

У меня есть QComboBox в одном из столбцов QTableView, Как я могу изменить другие столбцы в зависимости от того, что я выбрал в ComboBox? Я использую QComboBox как делегат.

1 ответ

Решение

Есть как минимум 2 подхода.

  • Используйте естественный для модели Qt itemChanged сигнал.
  • испустить сигнал от вашего делегата и поймать его в вашем главном окне.

Если ваш делегат является стандартным, что означает, что внутри setModelData() метод у вас есть что-то вроде:

QComboBox *line = static_cast<QComboBox*>(editor);
QString data = line->currentText();
//...
model->setData(index, data);

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

connect(model,&QStandardItemModel::itemChanged,[=](QStandardItem * item) {
    if(item->column() == NEEDED_COLUMN)
    {
        //you found, just get data and use it as you want
        qDebug() << item->text();
    }
});

Я использовал здесь C++11 (CONFIG += c++11 в .pro файл) и новый синтаксис сигналов и слотов, но, конечно, вы можете использовать старый синтаксис, если хотите.

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

Создать специальный сигнал на стороне делегата:

signals:
    void boxDataChanged(const QString & str);

Создать соединение внутри createEditor() метод:

QWidget *ItemDelegate::createEditor(QWidget *parent,
                                    const QStyleOptionViewItem &option,
                                    const QModelIndex &index) const
{
    QComboBox *editor = new QComboBox(parent);
    connect(editor,SIGNAL(currentIndexChanged(QString)),this,SIGNAL(boxDataChanged(QString)));
    return editor;
}

И использовать это!

ItemDelegate *del = new ItemDelegate;
ui->tableView->setItemDelegate( del);
ui->tableView->setModel(model);
    connect(del,&ItemDelegate::boxDataChanged,[=](const QString & str) {
            //you found, just get data and use it as you want
            qDebug() << str;
    });
Другие вопросы по тегам