Доброго всем времени суток.
Решил организовать в программе работу с глобальными хоткеями. Про
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.: Извиняюсь, если с моей стороны, является нетактично спрашивать по вопросам, возникшим при использовании примера с другого сайта.