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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Класс QtSpyOnApp для мониторинга событий в Qt.  (Прочитано 9621 раз)
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, возможно будете удивлены.
« Последнее редактирование: Май 31, 2010, 11:21 от SABROG » Записан
Karl-Philipp
Гость
« Ответ #1 : Май 07, 2010, 21:39 »

ого себе, столько событий! Улыбающийся
Записан
KuZ
Гость
« Ответ #2 : Май 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
Эти строки повторяются очень много раз. Извиняюсь если не в тему вопрос.
« Последнее редактирование: Май 07, 2010, 22:16 от KuZ » Записан
SABROG
Гость
« Ответ #3 : Май 07, 2010, 23:44 »

Эти строки повторяются очень много раз. Извиняюсь если не в тему вопрос.

У тебя не правильно настроен QtCreator или переменные окружения.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #4 : Май 07, 2010, 23:58 »

offtop
А у кого тут не давно make с ума сходил? симптомы похожи
Записан

Юра.
KuZ
Гость
« Ответ #5 : Май 08, 2010, 00:28 »

Эти строки повторяются очень много раз. Извиняюсь если не в тему вопрос.

У тебя не правильно настроен QtCreator или переменные окружения.
Понял спс.
Записан
zenden
Гость
« Ответ #6 : Май 08, 2010, 13:21 »

А что не так с прогрессбаром? расскажите, а то мне лень компилировать пример
Записан
Karl-Philipp
Гость
« Ответ #7 : Май 08, 2010, 13:46 »

А что не так с прогрессбаром? расскажите, а то мне лень компилировать пример
Все в порядке с прогрессбаром. Наверное, SABROG хотел обратить внимание на большое количество событий, возникающих при активизации прогрессбара Улыбающийся
Записан
SABROG
Гость
« Ответ #8 : Май 08, 2010, 14:31 »

Угу, Qt регистрирует таймер в ОС, который "спамит" событиями WM_TIMER несколько раз в секунду для того, чтобы стиль вызывал update() для прогрессбаров. Сделано, чтобы прогресс был виден, когда выполняется долгая операция блокирующая обновление интерфейса.
Записан
zenden
Гость
« Ответ #9 : Май 08, 2010, 17:23 »

Так если выполняется "долгая операция блокирующая обновление интерфейса.", как сообщения WM_TIMER будут доходить?
По-моему это сделано чтобы просто отображать анимацию
Записан
SABROG
Гость
« Ответ #10 : Май 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.
« Последнее редактирование: Май 11, 2010, 20:41 от SABROG » Записан
DpoHro
Гость
« Ответ #11 : Май 31, 2010, 09:40 »

Народ чето я под x11 не могу собрать примерец с qt4.6.2
Записан
mkv
Гость
« Ответ #12 : Май 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*)'

.....

подскажите, что нужно подправить?
Записан
SABROG
Гость
« Ответ #13 : Май 31, 2010, 11:21 »

Сори мой косяк, перевыложил.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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