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

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


person gartenriese    schedule 06.01.2015    source источник
comment
Чтобы создать более информативный ответ, скажите, пожалуйста, какую модель вы используете? QStandardItemModel или ваша собственная модель?   -  person Kosovan    schedule 06.01.2015
comment
@Чернобыль: модель QStandardItemModel.   -  person gartenriese    schedule 06.01.2015
comment
Я уже воспроизвел ваш код (делегат с полем со списком), и мое решение работает, если я выберу что-то в поле со списком и подтвержу это, например, нажав Enter. Но если вы хотите получить решение, в котором данные будут изменяться автоматически, когда вы выбираете другой элемент в поле со списком (без нажатия ввода), скажите мне, пожалуйста, я отредактирую свой ответ.   -  person Kosovan    schedule 06.01.2015
comment
К сожалению, следующие несколько часов я буду в офлайне, но я не хочу оставлять вас с моим, вероятно, полуполезным ответом, поэтому я решил написать и второй случай, он длиннее и немного сложнее, но я проверил его, он работает, расскажите меня Если у вас будут вопросы по этому поводу.   -  person Kosovan    schedule 06.01.2015


Ответы (1)


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

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

Если ваш делегат стандартный, это означает, что внутри метода 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++11CONFIG += c++11 по .pro файл) и новый синтаксис сигналов и слотов, но конечно вы можете использовать старый синтаксис, если хотите.

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

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

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;
    });
person Kosovan    schedule 06.01.2015
comment
Отличный ответ! Ваше первое предложение отлично сработало для меня, большое спасибо! - person gartenriese; 07.01.2015