QItemDelegate,如何在closeEditor()信号中提供我自己的EndEditHint

QItemDelegate, how to provide my own EndEditHint in closeEditor() signal?

本文关键字:我自己 EndEditHint 自己的 信号 closeEditor QItemDelegate      更新时间:2023-10-16

我有自己的表模型从QAbstractTableModel子类化。它安装在我的视图上(从QTableView子类化(。在视图中,我正在使用委托类(从QItemDelegate子类化(来编辑项目。

我想设置以下行为:当我使用委托完成数据编辑时,模型中的下一项(下一行和同一列中的项(应该可编辑。

文档说它是由QAbstractItemDelegate::EditNextItem信号中发送closeEditor()提示提供的。但默认情况下,此信号使用QAbstractItemDelegate::NoHint参数发送。问题是,在重新实现基本QItemDelegate虚函数(例如setModelData()(时,我不必显式调用此信号。

文档还说,此信号由内部事件筛选器发送,该筛选器在调用构造函数时安装在项目委托上QAbstractItemDelegate()

如何在closeEditor()信号中提供自己的EndEditHint

完成编辑后,委托会发送带有SubmitModelCache提示的closeEditor()信号。您必须保留此行为才能正确更新模型。

要在提交上次编辑的数据后立即在下一个单元格中打开编辑器,您可以重新实现QItemDelegate::eventFilter()但我发现重新实现QAbstractItemView::closeEditor()方法要容易得多:

void CMyTableView::closeEditor(QWidget *editor, QAbstractItemDelegate::EndEditHint hint)
{
    QTableView::closeEditor(editor, hint);
    QModelIndex index = moveCursor(MoveNext, Qt::NoModifier);
    if (!index.isValid()) 
        return;
    QPersistentModelIndex persistent(index);
    selectionModel()->setCurrentIndex(persistent, flags);
    // currentChanged signal would have already started editing
    if (index.flags() & Qt::ItemIsEditable && (!(editTriggers() & QAbstractItemView::CurrentChanged)))
        edit(persistent);
}

更简单的解决方案是(我不确定,但绝对值得一试(:

void CMyTableView::closeEditor(QWidget *editor, QAbstractItemDelegate::EndEditHint hint)
{
    QTableView::closeEditor(editor, hint);
    QTableView::closeEditor(nullptr, QAbstractItemDelegate::EditNextItem);       
}

moveCursor() 方法返回下一列和同一行的索引。如果要更改此行为,请重新实现它:

QModelIndex CMyTableView::moveCursor(CursorAction action, Qt::KeyboardModifiers modifiers)
{
    if (action == QAbstractItemView::MoveNext)
        action = QAbstractItemView::MoveDown;
    else if (action == QAbstractItemView::MovePrevious)
             action = QAbstractItemView::MoveUp;
    // Next row, same column.
    return QTableView::moveCursor(action, modifiers);
}

顺便说一下:当您按 Tab 键时,默认QTableView行为是关闭当前编辑器、保存数据并编辑下一个单元格。
因此,也许您唯一需要做的就是重新实现QTableView::moveCursor()方法。