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
我希望我的 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