Название: Как можно обойти "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> .cpp файл Код: View::View(QGraphicsScene *s): QGraphicsView(s),canMove(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() списке.
|