Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: zloyGamer от Декабрь 01, 2009, 04:25



Название: как передать eventFilter
Отправлено: zloyGamer от Декабрь 01, 2009, 04:25
как передать сообщение дочернему обьекту, например
bool quickSearch::eventFilter(QObject *obj, QEvent *event)
{
  if (event->type() == QEvent::KeyPress)
  {
    QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);

    if( obj == (QObject*)ui->lineEdit )
    {
      if(keyEvent->key() == Qt::Key_Down || keyEvent->key() == Qt::Key_Up)
      {
        //ui->view->eventFilter(obj,event);
        //ui->view->eventFilter(ui->view,event);
        return 1;
      }
    }
  }
  return QMainWindow::eventFilter(obj,event);
}
надо чтобы во вьюшку поступили сигналы о нажатии клавиш вниз и вверх, и сработала стандартная обработка этих событий - т.е. переход на следующий, предыдущий элемент..

для ui->view никаких eventFilter'ов я непереопределял,
как это можно сделать неполучая и проставляя текущие индексы?


Название: Re: как передать eventFilter
Отправлено: sendevent от Декабрь 01, 2009, 05:29
eventFilter нужен для ровно наоборот - "когда во view пришло событие "нажатие кнопки" - мы в "фильтре событий" можем кастомизировать обработку" (типа WinAPI'шного hook'а), т.е. алгоритм примерно такой:
1: для view генерируется событие;
2: мы его перехватываем в другом классе;
2.а: если событие "искомое" - обрабатываем customized; иначе - 2.б;
2.б: оставляем обработку события адресату;
Код:
bool SomeParent::eventFilter( QObject *obj, QEvent *event )
{
    if( event->type() == QEvent::Wheel )
    {
        QWheelEvent *wheelEvent = static_cast<QWheelEvent *>(event);
        if( customProcessChildWheelEvent( wheelEvent ) )
        {
            event->accept();
            return true;
        }
    }

    return QObject::eventFilter(obj, event); //-- standard event processing, e.g. default event handler
}
Цитировать
сигналы о нажатии клавиш <...> обработка этих событий
будут выполнены без всякого вмешательства с eventFilter, если у вьюхи есть обработчики.


Название: Re: как передать eventFilter
Отправлено: zloyGamer от Декабрь 01, 2009, 05:46
понятно что eventFilter нужен для кастомизации обработки событий, но как мне эти события передать во view (QListView) ?


Название: Re: как передать eventFilter
Отправлено: sendevent от Декабрь 01, 2009, 06:22
Код:
bool CustomEventHandler::eventFilter( QObject *obj, QEvent *event )
{
    return, млядь, QObject::eventFilter(obj, event); //-- standard event processing, e.g. DEFAULT EVENT HANDLER
}
хтото когото не понимает. не?


Название: Re: как передать eventFilter
Отправлено: sendevent от Декабрь 01, 2009, 06:40
 хто такой view - адресат события? или ваще левый объект, в которые надо передать событие, направленное не к нему?


Название: Re: как передать eventFilter
Отправлено: zloyGamer от Декабрь 01, 2009, 06:47
да, view - это левый обькт которому надо передать определенные нажатия клавиш, и пусть он сам определяет как их обрабатывать


Название: Re: как передать eventFilter
Отправлено: sendevent от Декабрь 01, 2009, 07:34
либо вызываем "свой" метод:
Код:
bool SomeParent::eventFilter( QObject *obj, QEvent *event )
{
    if( event->type() == TARGET_EVENT )
    {
        return m_pHandler->customProcessEvent( event );
    }       

    return QObject::eventFilter(obj, event); //-- standard event processing, e.g. default event handler
}
либо шлем сообщение:
Код:
bool SomeParent::eventFilter( QObject *obj, QEvent *event )
{
    if( event->type() == TARGET_EVENT )
    {
        //-- pEvent = new Event...
        //-- CoreApplication::post/sendEvent( m_pHandler, pEvent );
        //-- etc...
    }       

    return QObject::eventFilter(obj, event); //-- standard event processing, e.g. default event handler
}
либо я так и не понял, что в конце-концов надо... утро вечера мудренее будет ;)


Название: Re: как передать eventFilter
Отправлено: SASA от Декабрь 01, 2009, 11:17
оффтоп.
zloyGamer, аватар в 1,3 Мб - ЗЛО!!!


Название: Re: как передать eventFilter
Отправлено: zloyGamer от Декабрь 01, 2009, 15:12
пардон, уже исправились, щас проверить метод немогу, как получится отпишусь.


Название: Re: как передать eventFilter
Отправлено: zloyGamer от Декабрь 03, 2009, 07:08
спасибо sendevent
QCoreApplication::sendEvent( ui->view, myevent);  - это то что надо!