根据 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++11CONFIG += 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;
    });