在 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

编辑数据网格上的单元格后运行方法

在 QTableView 中编辑单元格时出现 QtVirtualKeyboard 焦点问题

extjs 4.0 鼠标编辑完单元格后离开单元格的事件?