QTableWidget:按 Enter 时不要关闭编辑器

QTableWidget: don't close editor when pressing Enter

我希望我的 QTableWidget 在编辑项目时按 Enter 键时触发编辑回调,但我希望编辑器保持激活状态 – 就像它 select 所有项目的内容一样当您开始编辑单元格时。

最好的方法是什么?

感谢您浏览这里。

您应该修改 table 的项目委托并使用事件过滤器过滤掉 Enter 事件并实现自定义行为:

class MyDelegate : public QStyledItemDelegate {
public:
  MyDelegate(QObject* parent) : QStyledItemDelegate(parent) {}
  QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option,
                        const QModelIndex& index) const {
    QWidget* editor = QStyledItemDelegate::createEditor(parent, option, index);
    editor->installEventFilter(const_cast<MyDelegate*>(this));
    return editor;
  }

  bool eventFilter(QObject* object, QEvent* event) {
    QWidget* editor = qobject_cast<QWidget*>(object);
    if (editor && event->type() == QEvent::KeyPress) {
      QKeyEvent* key_event = static_cast<QKeyEvent*>(event);
      if (key_event->key() == Qt::Key_Return) {
        emit commitData(editor); //save changes
        QLineEdit* line_edit = qobject_cast<QLineEdit*>(editor);
        if (line_edit) {
          line_edit->selectAll();
        }
        return true;
      }
    }
    return false;
  }
};

用法:

ui->tableWidget->setItemDelegate(new MyDelegate(this));

PyQt5 代码如下所示:

class GlyphCellItemDelegate(QStyledItemDelegate):
    def eventFilter(self, editor, event):
        if (event.type() == QEvent.KeyPress and event.key() == Qt.Key_Return):
            self.commitData.emit(editor)
            # Don't emit closeEditor, select contents instead
            editor.selectAll()
            return True
        return False