Russian Qt Forum
Май 02, 2024, 13:09 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Перехватить QWheelEvent  (Прочитано 5126 раз)
Alex437
Гость
« : Ноябрь 13, 2005, 00:39 »

Почему-то не перехватывается QWheelEvent для виджета, наследуемого от QTable.
Код такой:
Код:

class MyTable: public QTable
{
Q_OBJECT
public:
MyTable( QWidget * parent = 0, const char * name = 0 );
protected:
virtual void keyPressEvent( QKeyEvent *e );
virtual void wheelEvent( QWheelEvent * e );
};
MyTable::MyTable( QWidget * parent, const char * name )
:QTable( parent, name )
{
}
void MyTable::keyPressEvent( QKeyEvent *e )
{
QMessageBox::information( NULL, "", "keyPress event");
      QTable::keyPressEvent( e );
}
void MyTable::wheelEvent( QWheelEvent * e )
{
QMessageBox::information( NULL, "", "wheel event");
QTable::wheelEvent( e );
}

В результате перехватывается только QKeyEvent, но тоже как-то странно.
Если установить фокус на ячейку таблицы, то при первом нажатии
клавиши выводится MessageBox, а для последующих почему-то нет...
Кто-нибудь знает, что за фигня такая? :?
Записан
Sergeich
Гость
« Ответ #1 : Ноябрь 13, 2005, 16:16 »

QWheelEvent перехватывается обработчиком событий QTable::eventFilter, поэтому до wheelEvent оно не доходит. Если ты хочешь его обрабатывать, заведи свой обработчик событий:
Код:

class WheelHandler : public QObject
{
public:
  WheelHandler( MyTable* mt ) : QObject( mt )
  {
    mt->installEventFilter( this );
  }
  bool eventFilter( QObject* watched, QEvent* e )
  {
     if ( !watched.inherits( "MyTable" ) ) return false;
     MyTable* mt = (MyTable*) watched;
     if ( e->type == QEvent::Wheel ) {
       mt->wheelEvent();
       return true;
     }
     return false;
  }
 
};

QKeyEvent обрабатывается там же, после первого нажатия создается виджет для редактирования ( по  умолчанию QLineEdit ) и дальнейшие нажатия кнопок обрабатывает он, пока не потеряет фокус ввода.
Записан
Alex437
Гость
« Ответ #2 : Ноябрь 14, 2005, 10:22 »

Спасибо огромное  Улыбающийся
Записан
Alex437
Гость
« Ответ #3 : Ноябрь 15, 2005, 12:32 »

У меня еще получилось вставить обработчик событий в свой класс, чтобы не создавать дополнительный класс-обработчик.
Код:

class MyTable: public QTable
{
   Q_OBJECT
public:
   MyTable( QWidget * parent = 0, const char * name = 0 );
protected:
   bool eventFilter( QObject *obj, QEvent *ev );
};
MyTable::MyTable( QWidget * parent, const char * name )
      :QTable( parent, name )
{
}
bool MyTable::eventFilter( QObject *obj, QEvent *e )
{
    if ( e->type() == QEvent::Wheel ) {
        QMessageBox::information( NULL, "", "wheel event");
        return TRUE;
    }
    else
    if ( e->type() == QEvent::KeyPress ) {
        QMessageBox::information( NULL, "", "key event");
        return TRUE;
    }
    else {
        return QTable::eventFilter( obj, e );
    }
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.249 секунд. Запросов: 20.