crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> фильтр событий для делегата, даже не вызывается:(
Mifodix
  опции профиля:
сообщение 7.6.2010, 19:43
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 9
Регистрация: 7.6.2010
Пользователь №: 1789

Спасибо сказали: 0 раз(а)




Репутация:   0  


Всем доброго времени суток!
пытаюсь сделать собственную реализацию 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 &/* option */,
     const QModelIndex &/* index */) 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 &/* index */) 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.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 9.6.2010, 10:55
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


virtual bool eventFilter(QObject *target, QEvent *event) const;


QObject::eventFilter() никогда небыл константным, по сути Вы объявили совершенно другой метод.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Mifodix
  опции профиля:
сообщение 11.6.2010, 0:21
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 9
Регистрация: 7.6.2010
Пользователь №: 1789

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(SABROG @ 9.6.2010, 11:55) *
virtual bool eventFilter(QObject *target, QEvent *event) const;


QObject::eventFilter() никогда небыл константным, по сути Вы объявили совершенно другой метод.

Да, это я исправил, но не заработало:) Дело был в другом: нужно было удалить фильтр editor->removeEventFilter(editor); в createEditor.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 27.12.2024, 0:37