Qt - 选择抽象项委托更改时触发事件

时间:2014-07-04 07:58:22

标签: qt qtableview qitemdelegate

我正在尝试使用一行创建一个tableview,每行都有一个单独的下拉列表。用户只能选择值的组合。也就是说,如果用户从第一个下拉列表中选择“A”,则其他下拉列表中的值应该更新为可以匹配“A”的值。

我已经制作了我的AbsractItemDelegate类,并且值被分配得很好。但是,当一个值在其中一个下拉列表中发生变化时,我对如何触发事件感到困惑。

感谢。

以下是我的委托类实现:

FillComboBox::FillComboBox(QStringList the_list) : QItemDelegate() {
//list = new QStringList();
list = the_list; }

QWidget* FillComboBox::createEditor(QWidget* parent,
const QStyleOptionViewItem& /* option */,
const QModelIndex& /* index */) const {
QComboBox* editor = new QComboBox(parent);
editor->addItems(list);
editor->setCurrentIndex(2);
return editor; }


void FillComboBox::setEditorData(QWidget* editor,
const QModelIndex &index) const {
QString text = index.model()->data(index, Qt::EditRole).toString();
QComboBox* combo_box = dynamic_cast<QComboBox*>(editor);
combo_box->setCurrentIndex(combo_box->findText(text)); }


void FillComboBox::setModelData(QWidget* editor, QAbstractItemModel* model,
const QModelIndex &index) const {
QComboBox* combo_box = dynamic_cast<QComboBox*>(editor);
QString text = combo_box->currentText();
model->setData(index, text, Qt::EditRole); }

void FillComboBox::updateEditorGeometry(QWidget* editor,
const QStyleOptionViewItem &option, const QModelIndex &/* index */) const {
editor->setGeometry(option.rect); }

1 个答案:

答案 0 :(得分:1)

您可以更新&#34;其他&#34;的数据。当前项目的数据更新时,即FillComboBox::setModelData()中的项目。请找到实现所需行为的伪代码(请参阅注释):

void FillComboBox::setModelData(QWidget* editor, QAbstractItemModel* model,
                                const QModelIndex &index) const
{
    QComboBox* combo_box = dynamic_cast<QComboBox*>(editor);
    QString text = combo_box->currentText();
    model->setData(index, text, Qt::EditRole);

    // Find the model index of the item that should be changed and its data too
    int otherRow = ...; // find the row of the "other" item
    int otherColumn = ...; // find the column of the "other" item
    QModelIndex otherIndex = model->index(otherRow, otherColumn);
    QString newText = text + "_new";
    // Update other item too
    model->setData(otherIndex, newText, Qt::EditRole);
}