2015-05-20 3 views
0

Я хочу, чтобы мой QTableWidget вызывал обратные вызовы редакции при нажатии Enter во время редактирования элемента. НО я бы хотел, чтобы редактор оставался включенным - например, он просто выделил бы все содержимое элемента, например когда вы начнете редактировать ячейку.QTableWidget: не закрывайте редактор при нажатии Enter

Каков наилучший способ для этого?

Спасибо, что посмотрели здесь.

+0

Лучший способ - создать собственный редактор, если стандартное поведение не удовлетворяет вашим потребностям. –

ответ

2

Вы должны изменить пункт делегировать таблицы и использовать фильтры событий, чтобы отфильтровать Введите событие и реализации пользовательского поведения:

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)); 
+0

Спасибо за объяснение и код, я довольно новичок в Qt делегатах. – blameless75

0

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 
Смежные вопросы