Всем доброго времени суток!
пытаюсь сделать собственную реализацию QItemDelegate для QTreeView. Для редактирования используется QLineEdit. Идея такая: в QLineEdit должна записываться комбинация нажатых клавиш. Для этого необходимо изменить обработчик событий QLineEdit. Я решил использовать фильтр событий, внутри класса делегата, чтобы не создавать ещё один класс от QLineEdit, но во время редактирования eventFilter() внутри делегата даже не вызывается! В чём ошибка?
Заголовочный файл:
#ifndef SHORTCUTSLINEEDIT_H
#define SHORTCUTSLINEEDIT_H
#include <QObject>
#include <QStyleOptionViewItem>
#include <QItemDelegate>
#include <QLineEdit>
#include <QEvent>
#include <QKeyEvent>
class ShortcutsLineEdit : public QItemDelegate
{
Q_OBJECT
public:
explicit ShortcutsLineEdit(QObject *parent = 0);
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
void setEditorData(QWidget *editor, const QModelIndex &index) const;
void setModelData(QWidget *editor, QAbstractItemModel *model,const QModelIndex &index) const;
void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const;
protected:
virtual bool eventFilter(QObject *target, QEvent *event) const;
signals:
public slots:
};
#endif // SHORTCUTSLINEEDIT_H
CPP
ShortcutsLineEdit::ShortcutsLineEdit(QObject *parent) :
QItemDelegate(parent)
{
}
QWidget *ShortcutsLineEdit::createEditor(QWidget *parent,
const QStyleOptionViewItem &,
const QModelIndex &) const
{
QLineEdit *editor = new QLineEdit(parent);
editor->installEventFilter(const_cast<ShortcutsLineEdit*>(this));
return editor;
}
void ShortcutsLineEdit::setEditorData(QWidget *editor,
const QModelIndex &index) const
{
QString value = index.model()->data(index, Qt::DisplayRole).toString();
QLineEdit *lineEdit = static_cast<QLineEdit*>(editor);
lineEdit->setText(value);
}
void ShortcutsLineEdit::setModelData(QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index) const
{
QLineEdit *lineEdit = static_cast<QLineEdit*>(editor);
QString value = lineEdit->text();
model->setData(index, value, Qt::EditRole);
}
void ShortcutsLineEdit::updateEditorGeometry(QWidget *editor,
const QStyleOptionViewItem &option, const QModelIndex &) const
{
editor->setGeometry(option.rect);
}
bool ShortcutsLineEdit::eventFilter(QObject *target, QEvent *event) const
{
if (event->type() == QEvent::KeyPress)
{
QKeyEvent *keyEvent = (QKeyEvent *)event;
QLineEdit *t=(QLineEdit *)target;
t->setText("TEXT");
return true;
}
return false;
}
До номральной реализации фильтра дело, как видите, пока не дошло. Пусть хотя бы поменяет текст QLineEdit.