Russian Qt Forum

Qt => Дополнительные компоненты => Тема начата: SABROG от Май 07, 2010, 21:30



Название: Класс QtSpyOnApp для мониторинга событий в Qt.
Отправлено: SABROG от Май 07, 2010, 21:30
Написал не хитрый класс на базе QApplication, который выводит в консоль все сообщения от ОС приходящие окну:

  • WIN32: WM сообщения
  • X11: XEvent'ы

Все события Qt:

  • QEvent'ы

Все эмиты сигналов и вызовы слотов:

  • Обычные сигналы и сигналы, которые не подключены к какому либо слоту
  • Вызов всех слотов, даже внутренних классов Qt

Для фильтрации сигналов и слотов используется хак, такой же как и в модуле QTestLib. Писалось под версию Qt 4.6.2.

Пример вывода под Windows:

Код:
[QEVENT] QWindowsStyle(windows 318007656) QEvent::Timer
[SIGNAL] QEventDispatcherWin32(3e4ff8) awake ()
[SIGNAL] QEventDispatcherWin32(3e4ff8) aboutToBlock ()
[SIGNAL] QEventDispatcherWin32(3e4ff8) awake ()
[OS    ] WM_TIMER: hwnd(0x0x7605fe) wParam(0x0x2) lParam(0x0x0)
[QEVENT] QWindowsStyle(windows 318007656) QEvent::Timer
[SIGNAL] QEventDispatcherWin32(3e4ff8) awake ()
[SIGNAL] QEventDispatcherWin32(3e4ff8) aboutToBlock ()
[SIGNAL] QEventDispatcherWin32(3e4ff8) awake ()
[OS    ] WM_TIMER: hwnd(0x0x7605fe) wParam(0x0x2) lParam(0x0x0)
[QEVENT] QWindowsStyle(windows 318007656) QEvent::Timer
[SIGNAL] QEventDispatcherWin32(3e4ff8) awake ()
[SIGNAL] QEventDispatcherWin32(3e4ff8) aboutToBlock ()
[SIGNAL] QEventDispatcherWin32(3e4ff8) awake ()
[OS    ] WM_TIMER: hwnd(0x0x7605fe) wParam(0x0x2) lParam(0x0x0)
[QEVENT] QWindowsStyle(windows 318007656) QEvent::Timer
[SIGNAL] QEventDispatcherWin32(3e4ff8) awake ()

Под Linux:

Код:
[OS      ] PropertyNotify atom 0x10d (_NET_WM_SYNC_REQUEST_COUNTER), time 92645617, state: PropertyNewValue
[OS      ] ReparentNotify event 0x5a00002, window 0x5a00002, parent 0x18516b8 (0,0) override: No
[OS      ] PropertyNotify atom 0x133 (_NET_WM_STATE), time 92645627, state: PropertyNewValue
[OS      ] MapNotify event 0x5a00002, window 0x5a00002, override: No
[OS      ] Expose (0,0), width 1, height 1, count 0
[OS      ] PropertyNotify atom 0x10e (WM_STATE), time 92645627, state: PropertyNewValue
[OS      ] PropertyNotify atom 0x1a1 (_NET_WM_DESKTOP), time 92645628, state: PropertyNewValue
[OS      ] PropertyNotify atom 0x18a (_NET_FRAME_EXTENTS), time 92645635, state: PropertyNewValue
[OS      ] PropertyNotify atom 0x14f (_KDE_NET_WM_FRAME_STRUT), time 92645635, state: PropertyNewValue
[OS      ] PropertyNotify atom 0x1a7 (_NET_WM_ALLOWED_ACTIONS), time 92645635, state: PropertyNewValue
[OS      ] ClientMessage message type 0x107 (WM_PROTOCOLS), format 32
[OS      ] PropertyNotify atom 0x133 (_NET_WM_STATE), time 92645635, state: PropertyNewValue
[OS      ] FocusIn mode: NotifyNormal, detail: NotifyNonlinear
[OS      ] KeymapNotify keys:  39 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  
           0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  
[OS      ] ClientMessage message type 0x107 (WM_PROTOCOLS), format 32
[OS      ] ConfigureNotify event 0x5a00002, window 0x5a00002, (4,23), width 293, height 260
           border width 0, above 0x0, override: No

Для эксперимента поместите на форму QProgressBar, возможно будете удивлены.


Название: Re: Класс для мониторинга событий в Qt.
Отправлено: Karl-Philipp от Май 07, 2010, 21:39
ого себе, столько событий! :)


Название: Re: Класс для мониторинга событий в Qt.
Отправлено: KuZ от Май 07, 2010, 22:01
Открыл файл filterAllEvents.pro с помощью Qt Creator, при сборке выдает вот это в "консоль сборки", подскажите  как решить:
Код:
Выполняется сборка проекта filterAllEvents...
Запускается: D:/Program/Qt/mingw/bin/mingw32-make.exe clean -w
mingw32-make: Entering directory `D:/Temp/test/QtSpyOnAppTest/QtSpyOnAppTest'
d:\program\qt\qt\bin\qmake.exe -spec ..\..\..\..\Program\Qt\qt\mkspecs\win32-g++ -win32 CONFIG+=release -o Makefile filterAllEvents.pro
mingw32-make: Leaving directory `D:/Temp/test/QtSpyOnAppTest/QtSpyOnAppTest'
mingw32-make: Entering directory `D:/Temp/test/QtSpyOnAppTest/QtSpyOnAppTest'
d:\program\qt\qt\bin\qmake.exe -spec ..\..\..\..\Program\Qt\qt\mkspecs\win32-g++ -win32 CONFIG+=release -o Makefile filterAllEvents.pro
mingw32-make: Leaving directory `D:/Temp/test/QtSpyOnAppTest/QtSpyOnAppTest'
mingw32-make: Entering directory `D:/Temp/test/QtSpyOnAppTest/QtSpyOnAppTest'
d:\program\qt\qt\bin\qmake.exe -spec ..\..\..\..\Program\Qt\qt\mkspecs\win32-g++ -win32 CONFIG+=release -o Makefile filterAllEvents.pro
mingw32-make: Leaving directory `D:/Temp/test/QtSpyOnAppTest/QtSpyOnAppTest'
mingw32-make: Entering directory `D:/Temp/test/QtSpyOnAppTest/QtSpyOnAppTest'
d:\program\qt\qt\bin\qmake.exe -spec ..\..\..\..\Program\Qt\qt\mkspecs\win32-g++ -win32 CONFIG+=release -o Makefile filterAllEvents.pro
mingw32-make: Leaving directory `D:/Temp/test/QtSpyOnAppTest/QtSpyOnAppTest'
mingw32-make: Entering directory `D:/Temp/test/QtSpyOnAppTest/QtSpyOnAppTest'
d:\program\qt\qt\bin\qmake.exe -spec ..\..\..\..\Program\Qt\qt\mkspecs\win32-g++ -win32 CONFIG+=release -o Makefile filterAllEvents.pro
mingw32-make: Leaving directory `D:/Temp/test/QtSpyOnAppTest/QtSpyOnAppTest'
mingw32-make: Entering directory `D:/Temp/test/QtSpyOnAppTest/QtSpyOnAppTest'
d:\program\qt\qt\bin\qmake.exe -spec ..\..\..\..\Program\Qt\qt\mkspecs\win32-g++ -win32 CONFIG+=release -o Makefile filterAllEvents.pro
Эти строки повторяются очень много раз. Извиняюсь если не в тему вопрос.


Название: Re: Класс для мониторинга событий в Qt.
Отправлено: SABROG от Май 07, 2010, 23:44
Эти строки повторяются очень много раз. Извиняюсь если не в тему вопрос.

У тебя не правильно настроен QtCreator или переменные окружения.


Название: Re: Класс для мониторинга событий в Qt.
Отправлено: lit-uriy от Май 07, 2010, 23:58
offtop
А у кого тут не давно make с ума сходил? симптомы похожи


Название: Re: Класс для мониторинга событий в Qt.
Отправлено: KuZ от Май 08, 2010, 00:28
Эти строки повторяются очень много раз. Извиняюсь если не в тему вопрос.

У тебя не правильно настроен QtCreator или переменные окружения.
Понял спс.


Название: Re: Класс QtSpyOnApp для мониторинга событий в Qt.
Отправлено: zenden от Май 08, 2010, 13:21
А что не так с прогрессбаром? расскажите, а то мне лень компилировать пример


Название: Re: Класс QtSpyOnApp для мониторинга событий в Qt.
Отправлено: Karl-Philipp от Май 08, 2010, 13:46
А что не так с прогрессбаром? расскажите, а то мне лень компилировать пример
Все в порядке с прогрессбаром. Наверное, SABROG хотел обратить внимание на большое количество событий, возникающих при активизации прогрессбара :)


Название: Re: Класс QtSpyOnApp для мониторинга событий в Qt.
Отправлено: SABROG от Май 08, 2010, 14:31
Угу, Qt регистрирует таймер в ОС, который "спамит" событиями WM_TIMER несколько раз в секунду для того, чтобы стиль вызывал update() для прогрессбаров. Сделано, чтобы прогресс был виден, когда выполняется долгая операция блокирующая обновление интерфейса.


Название: Re: Класс QtSpyOnApp для мониторинга событий в Qt.
Отправлено: zenden от Май 08, 2010, 17:23
Так если выполняется "долгая операция блокирующая обновление интерфейса.", как сообщения WM_TIMER будут доходить?
По-моему это сделано чтобы просто отображать анимацию


Название: Re: Класс QtSpyOnApp для мониторинга событий в Qt.
Отправлено: SABROG от Май 09, 2010, 09:31
Так если выполняется "долгая операция блокирующая обновление интерфейса.", как сообщения WM_TIMER будут доходить?
По-моему это сделано чтобы просто отображать анимацию
Может быть. Вот только нафиг эти эвенты нужны, если у меня визуально ничего не меняется.
---
Тролли согласны с тем, что постоянно активированный таймер не нужен, если в нем нет необходимости:

Цитировать
It is needed because if (bar->minimum() == 0 && bar->maximum() == 0), the progressbar is animated.
But it is true that for most of the progressbar, there will not be any animation in the QWindowsStyle. So we could try to only start a timer if needed.


Название: Re: Класс QtSpyOnApp для мониторинга событий в Qt.
Отправлено: DpoHro от Май 31, 2010, 09:40
Народ чето я под x11 не могу собрать примерец с qt4.6.2


Название: Re: Класс QtSpyOnApp для мониторинга событий в Qt.
Отправлено: mkv от Май 31, 2010, 10:23
не линкуется....
$ make -j3
uic widget.ui
compiling main.cpp
compiling QtSpyOnApp.cpp
compiling QtSpyOnAppX11.cpp
moc widget.h
moc QtSpyOnApp.h
compiling widget.cpp
compiling tmp/release/moc_widget.cpp
QtSpyOnApp.cpp: In function 'bool osEventFilter(void*)':
QtSpyOnApp.cpp:86: предупреждение: unused variable 'handlersCount'
compiling tmp/release/moc_QtSpyOnApp.cpp
linking filterAllEvents
tmp/release/QtSpyOnApp.o:(.rodata+0x20): undefined reference to `printX11DummyHandler(_XEvent*)'
tmp/release/QtSpyOnApp.o:(.rodata+0x24): undefined reference to `printX11DummyHandler(_XEvent*)'

.....

подскажите, что нужно подправить?


Название: Re: Класс QtSpyOnApp для мониторинга событий в Qt.
Отправлено: SABROG от Май 31, 2010, 11:21
Сори мой косяк, перевыложил.