Интересные обсуждения
темы заинтересовавшие velkin
Визуализация графа соединений сигналов и слотов в Qt
14.09.2014
|
nen777w
|
Добрый час!
Есть ли утилита позволяющая визуализировать в виде графа подключения сигнал-слотов, в компайл тайме или даже лучше в рантайме.
По сути на уровне Qt это можно было бы сделать, но не сделали.
А я пока смог найти вот такое наколенное подделие которое умеет писать файлы для graphviz .
Есть ли утилита позволяющая визуализировать в виде графа подключения сигнал-слотов, в компайл тайме или даже лучше в рантайме.
По сути на уровне Qt это можно было бы сделать, но не сделали.
А я пока смог найти вот такое наколенное подделие которое умеет писать файлы для graphviz .
14.09.2014 11 комментариев |
N>Добрый час!
N>Есть ли утилита позволяющая визуализировать в виде графа подключения сигнал-слотов, в компайл тайме или даже лучше в рантайме.
N>По сути на уровне Qt это можно было бы сделать, но не сделали.
N>А я пока смог найти вот такое наколенное подделие которое умеет писать файлы для graphviz .
А в чём проблема написать самому? Через метаинформацию от объекта.
Под кутэ 4 в компайл тайме не получится в принципе. Парсинг исходников — дело не благодарное. Это не сильно проще будет, чем MOC на CLANG'e переделать
Под кутэ 5 — те же проблемы, только плюс, можно коннектить сигналы на статические методы / функции.
N>>Есть ли утилита позволяющая визуализировать в виде графа подключения сигнал-слотов, в компайл тайме или даже лучше в рантайме.
SaZ>А в чём проблема написать самому? Через метаинформацию от объекта.
Да не проблема, наверно. Надо попробовать. Другое дело на это не хватает времени как всегда
SaZ>Под кутэ 4 в компайл тайме не получится в принципе. Парсинг исходников — дело не благодарное.
SaZ>Под кутэ 5 — те же проблемы, только плюс, можно коннектить сигналы на статические методы / функции.
Да, но это IMHO наиболее точный способ увидеть всё сразу.
SaZ>Это не сильно проще будет, чем MOC на CLANG'e переделать
Тут не понял немного.
SaZ>>Это не сильно проще будет, чем MOC на CLANG'e переделать
N>Тут не понял немного.
Слышал, что есть проект , где на основе llvm написали moc компилятор.
Возможно, если пошаманить, то можно будет вытащить инфу о коннекшенах в удобоваримом виде. Но это так, мысли в слух (
мнелишьбы314здануть).N>Добрый час!
А где вообще хранится связь сигнал-слот, в проекте
Я поискал по всем файлам on_pushButton_XYZ_clicked в хедере, сишнике присутствуют и в генерируемом МОС_СРР и нет в UI! остается только по имени on_..._clicked
Нигде, только в генерённых moc файлах, которые надо парсить (вместе с исходными) разбирать и строить.
H>Я поискал по всем файлам on_pushButton_XYZ_clicked в хедере, сишнике присутствуют и в генерируемом МОС_СРР и нет в UI! остается только по имени on_..._clicked
Эгэж.
N>Добрый час!
N>Есть ли утилита позволяющая визуализировать в виде графа подключения сигнал-слотов, в компайл тайме или даже лучше в рантайме.
Давным давно был такое проект, может он тебе поможет и натолкнет на мысли
Руки пока не дошли, чтобы поковырять. Но походу это круто.
SaZ>Нарыл такой интересный репозиторий: https://github.com/KDAB/GammaRay
SaZ>Руки пока не дошли, чтобы поковырять. Но походу это круто.
Тоже пока руки не дошли посмотреть что это
N>Добрый час!
N>Есть ли утилита позволяющая визуализировать в виде графа подключения сигнал-слотов, в компайл тайме или даже лучше в рантайме.
N>По сути на уровне Qt это можно было бы сделать, но не сделали.
N>А я пока смог найти вот такое наколенное подделие которое умеет писать файлы для graphviz .
Для начала нужно понять, что все соединения и разъединения сигналов и слотов делаются только во время исполнения, во время компиляции ничего не происходит. В принципе можно было бы доставать информацию о текущих соединениях, в своё время даже покопался в исходниках Qt, но тут углубляемся в тему Private Classes, D-Pointer и так далее. Если нет времени, лучше забить на это дело.
V>Для начала нужно понять, что все соединения и разъединения сигналов и слотов делаются только во время исполнения, во время компиляции ничего не происходит.
Сами соединения — да. А вот в коде есть определённые номера строк, которые за это отвечают. Вопрос в том, что мы хотим получить.
V>В принципе можно было бы доставать информацию о текущих соединениях, в своё время даже покопался в исходниках Qt, но тут углубляемся в тему Private Classes, D-Pointer и так далее.
Чтобы получить эту инфу не нужно лезть в исходники. Тем более в private. Достаточно почитать документацию по метасистеме Qt. Вопрос в наличии готовой реализации с приемлемым выхлопом.
V>Если нет времени, лучше забить на это дело.
Если без этого практически невозможно понять, как работает код, то есть смысл потратить на это время, чтобы не стоять на месте.
SaZ>Здравствуйте, velkin, Вы писали:
V>>Для начала нужно понять, что все соединения и разъединения сигналов и слотов делаются только во время исполнения, во время компиляции ничего не происходит.
SaZ>Сами соединения — да. А вот в коде есть определённые номера строк, которые за это отвечают. Вопрос в том, что мы хотим получить.
Анализировать исходный код изначально неправильно, это значит, что есть глубокое непонимание исходных принципов работы метаобъектной системы Qt. Сразу оговорюсь, что сам использую Qt 4.8.x и говорю именно о нём.
V>>В принципе можно было бы доставать информацию о текущих соединениях, в своё время даже покопался в исходниках Qt, но тут углубляемся в тему Private Classes, D-Pointer и так далее.
SaZ>Чтобы получить эту инфу не нужно лезть в исходники. Тем более в private. Достаточно почитать документацию по метасистеме Qt. Вопрос в наличии готовой реализации с приемлемым выхлопом.
Вот автор и почитал документацию, если знаете как это сделать с помощью метаобъектной системы напишите в доказательство код. Проблема в том, что можно затереть мануалы до дыр и прийти к тому, что так просто это не сделать.
Лично я пришёл к двум ответам. Один из них получать информацию с самого объекта, другой строить свои списки. По второму варианту есть множество способов реализации, но это своего рода костыль, хотя я бы не отметал его сразу, в некоторых случаях вариант хорош, ведь свой список может обладать любыми возможностями.
Что касается первого варианта, то для начала нужно понять, что происходит во время соединения и разъединения.
Или вот QObject-Internals. Помнится, когда пытался решить эту задачу в линуксе меня ещё заставили поставить libqt4-private-dev, иначе не было нужной зависимости, а это плохо с точки зрения простой компиляции. Причём речь всего лишь об извлечении информации о соединениях, а не о построении графа, который лично я бы строил с помощью QGraphicsScene.
V>>Если нет времени, лучше забить на это дело.
SaZ>Если без этого практически невозможно понять, как работает код, то есть смысл потратить на это время, чтобы не стоять на месте.
Лёгкой победы не будет, нужно знать Qt на более глубоком уровне, а у автора нет времени, потому и говорю забить. Может это не критичный функционал с низким приоритетом. К тому же ещё нужно дать ответ на вопрос дублировать или извлекать списки соединений. Где-то на просторах интернета было решение.