Изменение данных в 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;
});