根据QComboBox的选择更改QTableView中的数据

时间:2015-01-06 19:12:58

标签: c++ qt model-view

我在QComboBox的其中一列中有一个QTableView。如何根据我在ComboBox中选择的内容更改其他列?我使用QComboBox作为代表。

1 个答案:

答案 0 :(得分: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++11CONFIG += 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;
    });