Название: Перехватить QWheelEvent
Отправлено: 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, а для последующих почему-то нет... Кто-нибудь знает, что за фигня такая? :?
Название: Перехватить QWheelEvent
Отправлено: Sergeich от Ноября 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 ) и дальнейшие нажатия кнопок обрабатывает он, пока не потеряет фокус ввода.
Название: Перехватить QWheelEvent
Отправлено: Alex437 от Ноября 14, 2005, 10:22
Спасибо огромное :)
Название: Перехватить QWheelEvent
Отправлено: Alex437 от Ноября 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 ); } }
|