在 QTableView 中编辑单元格后使用 TAB 键前进时如何避免编辑模式?
Posted
技术标签:
【中文标题】在 QTableView 中编辑单元格后使用 TAB 键前进时如何避免编辑模式?【英文标题】:How to avoid edit mode when I advance with TAB key after edit a cell in a QTableView? 【发布时间】:2016-12-29 09:11:30 【问题描述】:这是我的问题。当我在 QTableView 中编辑一个单元格时,如果我按 TAB 键,我希望当前单元格被更新,但下一个单元格不处于编辑模式。
我尝试在表中创建一个 eventFilter,但它不起作用。如果我在委托的编辑器小部件中创建 eventFilter 也不会。 这是我在 QTableView 中尝试的 eventFilter。我的想法是,如果当前单元格在最后一列和最后一行并且当前行不为空,我插入另一行(这工作正常),如果我正在编辑任何单元格,当我按 TAB 时,我可以放置在下一个单元格但没有编辑模式
这是一个sn-p的代码:
bool MiTabla::eventFilter(QObject *watched, QEvent *e)
if (e->type() == QEvent::KeyPress)
QModelIndex indice = this->currentIndex();
QKeyEvent *ke =static_cast<QKeyEvent*>(e);
switch (ke->key())
case (Qt::Key_Delete):
if (this->selectionModel()->isRowSelected(indice.row(),QModelIndex()))
//borrarLineas();
else
this->model()->setData(this->currentIndex(),"",Qt::EditRole);
break;
case (Qt::Key_Tab):
if (indice.row() == this->model()->rowCount(QModelIndex())-1
&& indice.column() == this->model()->columnCount(QModelIndex())-1
&& !NombreVacio())
this->model()->insertRow(this->model()->rowCount(QModelIndex()));
QModelIndex ind = this->model()->index(indice.row()+1,0);
this->setCurrentIndex(ind);
else //this doesn't work
QModelIndex ind = this->model()->index(indice.row(),indice.column()+1);
this->setCurrentIndex(ind);
break;
【问题讨论】:
解决方案草图:子类 QStyledItemDelegate,覆盖其eventFilter
,对 Tab 键进行稍微不同的处理,否则调用基类实现。参照。内置处理:code.woboq.org/qt5/qtbase/src/widgets/itemviews/…
eventFilter方法的返回值是多少?您是否尝试为 Key_Tab
案例返回“true”?
谢谢佩佩。这只是我在寻找。而 ramzes2,另一个线索是返回 false 让表“使用”按下的 TabKey
【参考方案1】:
谢谢。我已经按照你说的解决了。 我在委托类(从 QStyledItemDelegate 子类化)中重新实现了 eventFilter() 函数,如下所示:
bool DelegadoNombre::eventFilter(QObject *obj, QEvent* event)
if (event->type()==QEvent::KeyPress)
QKeyEvent* key = static_cast<QKeyEvent*>(event);
if (key->key()==Qt::Key_Tab || key->key()==Qt::Key_Enter || key->key()==Qt::Key_Return)
QLineEdit *editor=qobject_cast<QLineEdit*>(obj);
emit commitData(editor);
emit closeEditor(editor, QStyledItemDelegate::NoHint);
else
return QObject::eventFilter(obj, event);
return false;
else
return QObject::eventFilter(obj, event);
return false;
此函数告诉代理的编辑器,如果按下 Tab 键,它必须提交数据并关闭编辑器,但不会在编辑模式下打开下一个编辑器 QStyledItemDelegate::NoHint。 此外,返回 false 以允许表使用此事件
【讨论】:
以上是关于在 QTableView 中编辑单元格后使用 TAB 键前进时如何避免编辑模式?的主要内容,如果未能解决你的问题,请参考以下文章
编辑单元格时如何在 QTableView 中使用 Enter 键导航
如何从 QTest 单元测试中编辑 QTableView 单元格?
尝试在 QTableView 中编辑单元格时调用 QFileDialog