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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как можно обойти "static" в методе AbstractEventDispatcher::setEventFilter()  (Прочитано 4585 раз)
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.: Извиняюсь, если с моей стороны, является нетактично спрашивать по вопросам, возникшим при использовании примера с другого сайта.
Записан
SABROG
Гость
« Ответ #1 : Июль 27, 2010, 22:54 »

Самый простой вариант это вызвать QApplication::allWidget() и найти среди них свой QGraphicsView.
Записан
Anarion
Гость
« Ответ #2 : Июль 27, 2010, 23:29 »

Спасибо большое. Указал имя поле objectName() и нашел по нему в получаемом из QApplication::allWidget() списке.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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