在QTableView中编辑单元格后使用TAB键前进时如何避免编辑模式?

时间:2016-12-29 09:11:31

标签: c++ qt

这是我的问题。当我在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;

1 个答案:

答案 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以允许表使用此事件