根据 QComboBox 的选择更改 QTableView 中的数据
Changing data in a QTableView depending on the selection of a QComboBox
我在 QTableView
的其中一列中有一个 QComboBox
。如何根据我在 ComboBox
中选择的内容更改其他列?我正在使用 QComboBox
作为代表。
至少有两种方法。
- 对 Qt 的模型
itemChanged
信号使用自然。
- 从您的委托发出信号并在您的主 window 中捕获它。
如果你的委托是标准的,这意味着在 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
文件)和 new syntax of signals and slots,当然如果你愿意,你可以使用旧的语法。
我已经复制了您的代码(使用组合框委托),如果我 select 组合框中的某些内容并通过例如输入单击确认,我的解决方案就可以工作。但是如果你想获得数据将自动更改的解决方案,当你 select combobox 中的另一个项目(不按 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;
});
我在 QTableView
的其中一列中有一个 QComboBox
。如何根据我在 ComboBox
中选择的内容更改其他列?我正在使用 QComboBox
作为代表。
至少有两种方法。
- 对 Qt 的模型
itemChanged
信号使用自然。 - 从您的委托发出信号并在您的主 window 中捕获它。
如果你的委托是标准的,这意味着在 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
文件)和 new syntax of signals and slots,当然如果你愿意,你可以使用旧的语法。
我已经复制了您的代码(使用组合框委托),如果我 select 组合框中的某些内容并通过例如输入单击确认,我的解决方案就可以工作。但是如果你想获得数据将自动更改的解决方案,当你 select combobox 中的另一个项目(不按 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;
});