У меня есть QComboBox
в одном из столбцов QTableView
. Как я могу изменить другие столбцы в зависимости от того, что я выбрал в ComboBox
? Я использую QComboBox
в качестве делегата.
Изменение данных в QTableView в зависимости от выбора QComboBox
Ответы (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++11
(с CONFIG += 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;
});