我在QComboBox
的其中一列中有一个QTableView
。如何根据我在ComboBox
中选择的内容更改其他列?我使用QComboBox
作为代表。
答案 0 :(得分:2)
至少有两种方法。
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
文件)和new syntax of signals and slots,但当然如果需要,您可以使用旧语法。
我已经复制了您的代码(使用组合框代理),如果我在组合框中选择了某些内容并且通过输入点击确认,我的解决方案可以正常工作。但是如果你想获得自动更改数据的解决方案,当你在组合框中选择另一个项目时(不按回车键),请参阅下一个案例:
在代表身上创建特殊信号:
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;
});