Фреймворк Qt предоставляет неплохие средства разработки — входящая в него IDE Qt Creator включает дизайнер, отладчик, профайлер и другие удобные вещи. К сожалению, даже со всем этим иногда не очень понятно, почему приложение в данные момент выглядит так, как выглядит: чего-то не видно, что-то выглядит не так, как ожидалось, где-то неподходящий размер шрифта или неверная картинка.
Часть этих проблем может быть решена в Qt Designer, но только часть. Qt Designer имеет несколько существенных недостатков: во-первых, он неверно отображает положение Qt Quick компонентов в случае активного использования Javascript при расчете их координат и размеров, во-вторых в дизайнере мы видим состояние только «пустой» формы, без загруженных в неё данных. В общем, очень не хватает чего-то вроде инструментов разработчика в любом современном браузере: чтобы можно было посмотреть всё дерево компонентов, найти нужный, увидеть его положение относительно других, свойства, поправить на лету что-то, подобрать цвет\шрифт\размер, увидеть какие обработчики повешены на события и т.д.
И такой инструмент в мире Qt появился! Встречайте — GammaRay, средство интроспекции приложений на Qt. GammaRay понимает, что такое Qt, из чего состоит ваше Qt-приложение, как в нём взаимодействую компоненты, как они выглядят, как генерируются и обрабатываются события и т.д. Давайте посмотрим, что умеет GammaRay.
![](https://habrastorage.org/files/b3c/5b2/52c/b3c5b252c1014f8f82f6052426b12207.png)
По-сути GammaRay это не один, а около 20-и различных инструментов, собранных в одно приложение. Каждый инструмент размещён на своей вкладке. Могут быть активны не все вкладки. К примеру, вкладка Quick Scenes активна только если приложение использует Qt Quick компоненты.
Бинарников под Windows нет. Исходники здесь: https://github.com/KDAB/GammaRay. Для сборки под Windows + Qt 5.4 мне понадобилось поправить файл CMakeLists.txt, добавив в него следующие строки с указанием путей к моей папке с Qt 5.4:
В остальном всё собирается так, как написано в инструкции (для Windows + Visual Studio):
Теперь нужно собрать какое-нибудь Qt-приложение, вполне подойдут примеры из стандартной поставки Qt. Дальше нужно запустить gammaray, передав ему параметром путь к экзешнику подконтрольного приложения:
Я начну с самой для меня интересной вкладки — Quick Scenes. Именно она является Qt-аналогом тех самых браузерных Developer Tools, о которых я писал выше. В левой верхней части вкладки мы видим дерево Qt Quick компонентов, причём не в «изначальной» его форме, а со всеми созданными на рантайме объектами.
![](https://habrastorage.org/files/fa4/a1f/885/fa4a1f885d4d4f8bbab25e49585054a7.png)
Мы можем выбрать нужный объект в дереве — и он будет подсвечен на превью в нижней части окна.
![](https://habrastorage.org/files/f03/1ff/60c/f031ff60c0a648d1a8141ffd1de02454.png)
Мы можем посмотреть свойства этого объекта в правой части окна, изменить их. Таким образом удобно подбирать размеры элементов, шрифты, цвета, смотреть как будет помещаться текст разной длины в отведённых ему границах.
![](https://habrastorage.org/files/8d2/3d2/df2/8d23d2df2c9b4d18871fee18df3c91de.png)
Мы можем вызвать определённый метод компонента. К примеру, для MouseArea мы можем сгенерировать «клик», что приведёт к вызову логики его обработки.
![](https://habrastorage.org/files/cf0/9dc/5a4/cf09dc5a4d4e4f2bbc7f378acb952ed5.png)
Окно превью имеет несколько режимов и, кстати, является «двунаправленным» — т.е. выполняемые в нём действия влияют не только на превью, но и на само приложение.
Кроме того, мы можем включить вот такой удобный режим отображение контента, позволяющий легче понимать взаимное расположение компонентов.
![](https://habrastorage.org/files/577/5b2/287/5775b22872fd4a55b2660eb78437db38.png)
Здесь перечислены вообще все Qt-объекты вашего приложения. Функционал: перечисление свойств, вызов методов, просмотр сигналов-слотов. Немного трудновато найти конкретный объект, но есть фильтр, иногда помогает.
![](https://habrastorage.org/files/d99/17b/4d4/d9917b4d463b45be92647779c7c8f2f2.png)
Должна показывать модели, используемые в приложении (наследников QAbstractListModel). В моём случае приложение падало всякий раз при открытии этой вкладки. Возможно, попалась нестабильная версия GammaRay (брал ведь прямо с GitHub).
![](https://habrastorage.org/files/3f8/b4b/cbe/3f8b4bcbe7c24276af89bb694b2da7d1.png)
Все таймеры приложения
![](https://habrastorage.org/files/900/ce3/0e0/900ce30e02cd428387c3444dd8e9156c.png)
Позволяет просмотреть все ресурсы Qt-приложения (картинки, звуки, шейдеры, QML-код) а также экспортировать их при необходимости. Не сильно полезная вещь при работе со своим приложением (всё то же самое вы видите в дереве ресурсов в Qt Creator), но может помочь при анализе чужой программы.
![](https://habrastorage.org/files/9b7/52a/650/9b752a65086f4570a5f89a5f7c18e686.png)
Показывает события, генерируемые всеми Qt-объектами в приложении. Интерфейс пока не очень удобен (слабо понятно, какой именно экземпляр определенного типа сгенерировал события, не хватает возможностей группировки и гибкости поиска нужных объектов). Тем ни менее, при определенной сноровке позволяет быстро увидеть последовательность событий, так сказать, «ухватить общую картинку».
![](https://habrastorage.org/files/01e/80d/354/01e80d3547804fadbdb2131be152fcf9.png)
Визуализация конечных автоматов. Показывает автомат в общем, текущее состояние, историю переходов между состояниями — в общем, весьма наглядно.
![](https://habrastorage.org/files/1d5/b5d/be5/1d5b5dbe5eb249dcb23783ed4b0d5a44.png)
Остальные вкладки GammaRay показались мне менее интересными, хотя мало ли что кому нужно: просмотр шрифтов, локалей, логов, мета-объектов, мета-типов, переменных окружения, стилей компонентов.
В общем, GammaRay — отличная утилита, хорошо вписывающаяся в инфраструктуру Qt и позволяющая сэкономить несколько минут там, где их действительно легко можно сэкономить.
Часть этих проблем может быть решена в Qt Designer, но только часть. Qt Designer имеет несколько существенных недостатков: во-первых, он неверно отображает положение Qt Quick компонентов в случае активного использования Javascript при расчете их координат и размеров, во-вторых в дизайнере мы видим состояние только «пустой» формы, без загруженных в неё данных. В общем, очень не хватает чего-то вроде инструментов разработчика в любом современном браузере: чтобы можно было посмотреть всё дерево компонентов, найти нужный, увидеть его положение относительно других, свойства, поправить на лету что-то, подобрать цвет\шрифт\размер, увидеть какие обработчики повешены на события и т.д.
И такой инструмент в мире Qt появился! Встречайте — GammaRay, средство интроспекции приложений на Qt. GammaRay понимает, что такое Qt, из чего состоит ваше Qt-приложение, как в нём взаимодействую компоненты, как они выглядят, как генерируются и обрабатываются события и т.д. Давайте посмотрим, что умеет GammaRay.
![](https://habrastorage.org/files/b3c/5b2/52c/b3c5b252c1014f8f82f6052426b12207.png)
По-сути GammaRay это не один, а около 20-и различных инструментов, собранных в одно приложение. Каждый инструмент размещён на своей вкладке. Могут быть активны не все вкладки. К примеру, вкладка Quick Scenes активна только если приложение использует Qt Quick компоненты.
Сборка
Бинарников под Windows нет. Исходники здесь: https://github.com/KDAB/GammaRay. Для сборки под Windows + Qt 5.4 мне понадобилось поправить файл CMakeLists.txt, добавив в него следующие строки с указанием путей к моей папке с Qt 5.4:
set(Qt5Core_DIR "D:/Qt/5.4/msvc2010_opengl/lib/cmake/Qt5Core")
set(Qt5_DIR "D:/Qt/5.4/msvc2010_opengl/lib/cmake/Qt5")
set(QT_QMAKE_EXECUTABLE "D:/Qt/5.4/android_x86/bin/qmake.exe")
В остальном всё собирается так, как написано в инструкции (для Windows + Visual Studio):
mkdir build
cd build
cmake -G "NMake Makefiles" ..
nmake
nmake install
Запуск
Теперь нужно собрать какое-нибудь Qt-приложение, вполне подойдут примеры из стандартной поставки Qt. Дальше нужно запустить gammaray, передав ему параметром путь к экзешнику подконтрольного приложения:
gammaray.exe D:\Qt\Examples\Qt-5.4\quick\demos\build-stocqt-Desktop_Qt_5_4_0_MSVC2010_OpenGL_32bit-Debug\debug\stocqt.exe
Вкладка Quick Scenes
Я начну с самой для меня интересной вкладки — Quick Scenes. Именно она является Qt-аналогом тех самых браузерных Developer Tools, о которых я писал выше. В левой верхней части вкладки мы видим дерево Qt Quick компонентов, причём не в «изначальной» его форме, а со всеми созданными на рантайме объектами.
![](https://habrastorage.org/files/fa4/a1f/885/fa4a1f885d4d4f8bbab25e49585054a7.png)
Мы можем выбрать нужный объект в дереве — и он будет подсвечен на превью в нижней части окна.
![](https://habrastorage.org/files/f03/1ff/60c/f031ff60c0a648d1a8141ffd1de02454.png)
Мы можем посмотреть свойства этого объекта в правой части окна, изменить их. Таким образом удобно подбирать размеры элементов, шрифты, цвета, смотреть как будет помещаться текст разной длины в отведённых ему границах.
![](https://habrastorage.org/files/8d2/3d2/df2/8d23d2df2c9b4d18871fee18df3c91de.png)
Мы можем вызвать определённый метод компонента. К примеру, для MouseArea мы можем сгенерировать «клик», что приведёт к вызову логики его обработки.
![](https://habrastorage.org/files/cf0/9dc/5a4/cf09dc5a4d4e4f2bbc7f378acb952ed5.png)
Окно превью имеет несколько режимов и, кстати, является «двунаправленным» — т.е. выполняемые в нём действия влияют не только на превью, но и на само приложение.
Кроме того, мы можем включить вот такой удобный режим отображение контента, позволяющий легче понимать взаимное расположение компонентов.
![](https://habrastorage.org/files/577/5b2/287/5775b22872fd4a55b2660eb78437db38.png)
Вкладка Objects
Здесь перечислены вообще все Qt-объекты вашего приложения. Функционал: перечисление свойств, вызов методов, просмотр сигналов-слотов. Немного трудновато найти конкретный объект, но есть фильтр, иногда помогает.
![](https://habrastorage.org/files/d99/17b/4d4/d9917b4d463b45be92647779c7c8f2f2.png)
Вкладка Models
Должна показывать модели, используемые в приложении (наследников QAbstractListModel). В моём случае приложение падало всякий раз при открытии этой вкладки. Возможно, попалась нестабильная версия GammaRay (брал ведь прямо с GitHub).
![](https://habrastorage.org/files/3f8/b4b/cbe/3f8b4bcbe7c24276af89bb694b2da7d1.png)
Вкладка Timers
Все таймеры приложения
![](https://habrastorage.org/files/900/ce3/0e0/900ce30e02cd428387c3444dd8e9156c.png)
Вкладка Resources
Позволяет просмотреть все ресурсы Qt-приложения (картинки, звуки, шейдеры, QML-код) а также экспортировать их при необходимости. Не сильно полезная вещь при работе со своим приложением (всё то же самое вы видите в дереве ресурсов в Qt Creator), но может помочь при анализе чужой программы.
![](https://habrastorage.org/files/9b7/52a/650/9b752a65086f4570a5f89a5f7c18e686.png)
Signals
Показывает события, генерируемые всеми Qt-объектами в приложении. Интерфейс пока не очень удобен (слабо понятно, какой именно экземпляр определенного типа сгенерировал события, не хватает возможностей группировки и гибкости поиска нужных объектов). Тем ни менее, при определенной сноровке позволяет быстро увидеть последовательность событий, так сказать, «ухватить общую картинку».
![](https://habrastorage.org/files/01e/80d/354/01e80d3547804fadbdb2131be152fcf9.png)
State Machines
Визуализация конечных автоматов. Показывает автомат в общем, текущее состояние, историю переходов между состояниями — в общем, весьма наглядно.
![](https://habrastorage.org/files/1d5/b5d/be5/1d5b5dbe5eb249dcb23783ed4b0d5a44.png)
Остальные вкладки GammaRay показались мне менее интересными, хотя мало ли что кому нужно: просмотр шрифтов, локалей, логов, мета-объектов, мета-типов, переменных окружения, стилей компонентов.
В общем, GammaRay — отличная утилита, хорошо вписывающаяся в инфраструктуру Qt и позволяющая сэкономить несколько минут там, где их действительно легко можно сэкономить.