【问题标题】:QTableWidget: don't close editor when pressing EnterQTableWidget:按 Enter 时不要关闭编辑器
【发布时间】:2015-05-20 16:41:28
【问题描述】:

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

最好的方法是什么?

感谢您在这里查看。

【问题讨论】:

  • 最佳方式 - 如果标准行为不能满足您的需求,请创建您自己的编辑器。

标签: qt qtableview qtablewidget qtablewidgetitem


【解决方案1】:

您应该修改表格的项目委托并使用事件过滤器来过滤掉 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));

【讨论】:

  • 感谢您的解释和代码,我对 Qt 代表很陌生。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-16
    • 2019-02-22
    • 1970-01-01
    • 1970-01-01
    • 2012-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多