Russian Qt Forum

Qt => Общие вопросы => Тема начата: Anarion от Июль 27, 2010, 20:45



Название: Как можно обойти "static" в методе AbstractEventDispatcher::setEventFilter()
Отправлено: Anarion от Июль 27, 2010, 20:45
Доброго всем времени суток.
Решил организовать в программе работу с глобальными хоткеями. Про libqxt слышал, устанавливал, но после компилляции, при запуске, программа сразу же завершалась с ошибкой вида "приложение уже запущено", что конечно же было неправдой. Да и слишком там все умно, чтоли  :).
В общем, хотел пойти другим путем. Почитал про  AbstractEventDispatcher, посмотрел пример (http://forum.vingrad.ru/act-ST/f-466/t-273910.html), но все таки столкнулся с указанной там проблемой.
Кратко суть.

.h файл:
Код:
#include <windows.h>
#define HK_SH 0xC001

class View : public QGraphicsView
{
    Q_OBJECT
  public:
    View(QGraphicsScene *s);
    static bool hotKeyEventFilter(void *message);
}

.cpp файл
Код:
View::View(QGraphicsScene *s): QGraphicsView(s),canMove(false)
{
  m_EventDispatcher = QAbstractEventDispatcher::instance();
  QCoreApplication::instance()->installEventFilter(m_EventDispatcher);
  m_EventDispatcher->setEventFilter((QAbstractEventDispatcher::EventFilter)(View::hotKeyEventFilter));
}

bool View::hotKeyEventFilter(void *message)
{
    MSG *msg;
    msg = (MSG*)message;
    if (msg->message == WM_HOTKEY)
    {
      qDebug() << msg->wParam; //(1)
      qDebug() << this; //(2)
      return true;
    }
    return false;
}

Если не объявить метод static bool hotKeyEventFilter(void *message); статически, то команда
m_EventDispatcher->setEventFilter((QAbstractEventDispatcher::EventFilter)(View::hotKeyEventFilter)); будет ругаться
"error: invalid use of member (did you forget the '&' ?)". Но если этот метод сделать статиским, то из него я не смогу вызвать нестатические слоты или даже обычные методы класса View, что в моем случае вообще бесполезно.

Если ли же все таки не объявлять статически, то можно "изменить" ошибку на варнинг:
m_EventDispatcher->setEventFilter((QAbstractEventDispatcher::EventFilter)(&View::hotKeyEventFilter));.
Варнинг звучит так:"warning: converting from 'bool (View::*)(void*)' to 'bool (*)(void*)'".
Установка фильтра после этого вроде как пройдет успешно, но любое обращение к методам класса, даже вызов qDebug() << this;(2) приводит к вылету программы. В то же время, qDebug() << msg->wParam;(1) будет работать, так же как и QApplication::beep();

Собственно, вопрос:как можно обойти статическое объявление метода, если вообще возможно.
Заранее благодарен.

P.S.: Признаюсь, я не силен в области С++, касаемой работы со static(и т.п.) и const (и т.п.) :(.
P.P.S.: Извиняюсь, если с моей стороны, является нетактично спрашивать по вопросам, возникшим при использовании примера с другого сайта.


Название: Re: Как можно обойти "static" в методе AbstractEventDispatcher::setEventFilter()
Отправлено: SABROG от Июль 27, 2010, 22:54
Самый простой вариант это вызвать QApplication::allWidget() и найти среди них свой QGraphicsView.


Название: Re: Как можно обойти "static" в методе AbstractEventDispatcher::setEventFilter()
Отправлено: Anarion от Июль 27, 2010, 23:29
Спасибо большое. Указал имя поле objectName() и нашел по нему в получаемом из QApplication::allWidget() списке.