确定QTableView是否具有打开的编辑器

Dav*_*eer 9 qt qtableview

有没有办法确定QTableView当前单元格中是否有一个打开的编辑器?我需要处理以下情况:

  • 用户双击单元格并编辑数据,但使单元格处于"编辑"状态.
  • 在UI的另一部分,执行一个操作来更改基础模型的选定行.
  • 回到我的视图,我想确定新选择的行是否与打开的行相同.如果没有,我需要采取行动.(提示用户?自动提交?还原?)

我看到如何获取当前项目,并可以获得该项目的委托,但我没有看到任何isEditMode()我希望找到的属性.

有人能指出我正确的方向吗?

wed*_*oft 9

只需检查是否返回值

State QAbstractItemView::state () const
Run Code Online (Sandbox Code Playgroud)

QTableView::EditingState
Run Code Online (Sandbox Code Playgroud)


Kal*_*son 2

对您的委托进行子类化,使其包含一个访问器来告诉您何时进行编辑:

void MyDelegate::setEditorData ( QWidget * editor, const QModelIndex & index ) const {
    // _isEditing  will have to be mutable because this method is const
    _isEditing = true; 
    QStyledItemDelegate::setEditorData(editor, index);
}

void MyDelegate::setModelData ( QWidget * editor, QAbstractItemModel * model, const QModelIndex & index ) const {
    QStyledItemDelegate::setModelData(editor, model, index);
    _isEditing = false;
}

bool MyDelegate::isEditing() const { return _isEditing; }
Run Code Online (Sandbox Code Playgroud)

然后你可以检查代表看看发生了什么。或者和/或如果您不喜欢mutable,您可以发出信号,以便您知道委托处于什么状态。

  • 正如 Florian Kusche 在他的回答中已经指出的那样,这不起作用,因为仅在提交编辑时才调用 setModelData() ,而在取消编辑时则不会调用。 (3认同)