这是我的问题。当我在QTableView中编辑单元格时,我希望如果按TAB键,则会更新当前单元格,但下一个单元格不处于编辑模式。
我尝试在表中创建一个eventFilter,但它不起作用。如果我在委托的编辑器小部件中创建eventFilter,也不会。 这是我在QTableView中尝试的eventFilter。我的想法是,如果当前单元格在最后一列和行中并且当前行不为空,我插入另一行(这很好),如果我正在编辑任何单元格,当我按TAB时我可以放在下一行单元格,但没有编辑模式
这是代码的片段:
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;
答案 0 :(得分: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以允许表使用此事件