Название: Нужен совет в выборе инструмента Отправлено: Vitto74 от Март 15, 2016, 10:45 Здравствуйте.
В связи переходом на Linux встала необходимость в замене программы FPinger на аналог, но для Linux аналогов, которые меня устраивают нет. Запускать под Wine не особо хочется, поэтому было решено сделать свою пинговалку с nmap и пингвинами. (Nagion и Zabbix не предлагать - уже есть) В технической части особых вопросов у меня нет - liboping всё делает за меня, а nmap пока не в приоритете. Вопрос в следующем - каким образом наиболее просто и удобно рисовать карту сети. Попробовал с наскока рисовать виджетами. Вполне получается - и двигать удобно, и подстраивать размер карты под расположение и события перехватывать и всё, что угодно делать, но только с виджетами. Можно еще попробовать сделать прямоугольники - скорее всего проблем также не возникнет. Но как сделать класс для отображения ломаной линии, чтобы не выдумывать абсолютно запутанную логику, да еще так, чтобы можно было произвольные вершины добавлять, у меня просто нет идей. Можно пойти другим путем - использовать QGraphicsScene и создать свою логику работы со сценой, но этот путь более замудреный, хотя в перспективе более быстрый. Резюмируя - чем удобнее рисовать ломанные линии, вершины которых можно двигать мышкой - с помощью виджетов или в QGraphicsScene? Или может быть я что-то пропустил или не знаю и моя проблема решается просто и изящно? Название: Re: Нужен совет в выборе инструмента Отправлено: Racheengel от Март 15, 2016, 11:05 QGraphicsScene удобней, однозначно.
Но если хочется полного контроля - то делать свой виджет, со своей отрисовкой и обработкой мыши. Но это долго и нудно :) Название: Re: Нужен совет в выборе инструмента Отправлено: Vitto74 от Март 15, 2016, 11:16 QGraphicsScene удобней, однозначно. Спорно. Без линий основная логика укладывается менее чем в сотню строк.Но если хочется полного контроля - то делать свой виджет, со своей отрисовкой и обработкой мыши. Это в любом случае придется делать, но в QWidget это проще - кода меньше. Меньше кода - меньше багов.Но это долго и нудно :) Потому и спрашиваю совета.Название: Re: Нужен совет в выборе инструмента Отправлено: Igors от Март 15, 2016, 11:34 Резюмируя - чем удобнее рисовать ломанные линии, вершины которых можно двигать мышкой - с помощью виджетов или в QGraphicsScene? И то и другое слишком "жирно", а с др стороны движение вершин все равно писать. Вообще надо исходить не из шкурных интересов "что удобнее" (как бы поменьше писать), а из "что правильно" (или "адекватно"), оно самым коротким и будет. Думается здесь это прямая отрисовка линий поверх в paintEvent Название: Re: Нужен совет в выборе инструмента Отправлено: Racheengel от Март 15, 2016, 11:59 Спорно. Без линий основная логика укладывается менее чем в сотню строк. ... Это в любом случае придется делать, но в QWidget это проще - кода меньше. Меньше кода - меньше багов. Сделать отдельный виджет, поддерживающий выделение элементов, драг-дроп и прочие вещи - ПРОЩЕ? Не верю :) (с)... Название: Re: Нужен совет в выборе инструмента Отправлено: Igors от Март 15, 2016, 12:16 Сделать отдельный виджет, поддерживающий выделение элементов, драг-дроп и прочие вещи - ПРОЩЕ? Нет, НАМНОГО проще :)Название: Re: Нужен совет в выборе инструмента Отправлено: Vitto74 от Март 15, 2016, 12:33 Думается здесь это прямая отрисовка линий поверх в paintEvent [Рассуждения] Нужно унаследовать QWidget и хранить внутри список линий. Потребуется ловить события мыши, искать линии по координатам клика и передвигать линии по хитрой логике (они же "типа" ломаные, хотя совсем не ломаные). С толщиной линий и попаданием по линии придется помучиться. [/Рассуждения] Название: Re: Нужен совет в выборе инструмента Отправлено: Vitto74 от Март 15, 2016, 12:54 Виджет проще в случае, если объекты на карте прямоугольные. ДрагДроп не особо нужен (хотя может палитру элементов запилить?), Выделение - тоже не проблема. А вот в QGraphicsScene логика и прямоугольников и линий задается одинаково сложно.
Мне почему-то не пришла в голову мысль, о том, что можно рисовать прямо на карте. [Мысли вслух] Если есть линия с координатами (X1,Y1)-(X2,Y2) и толщиной fat, то зная координату posX мы можем высчитать диапазон Y, который попадает в линию заданной толщины. [/Мысли вслух] Название: Re: Нужен совет в выборе инструмента Отправлено: Racheengel от Март 15, 2016, 13:05 А как насчет масштабирования (зума), изменения размеров, множественного выделения, перетаскивания прямоугольников? В QGraphicsScene это уже "из коробки". А на виджетах свой велосипед лепить можно долго.
Я как-то делал подобное - и тоже стоял выбор между своим виджетом и сценой. В итоге выбрал сцену, сэкономил много времени. Да, косяки тоже были, но решились как-то :) Название: Re: Нужен совет в выборе инструмента Отправлено: Racheengel от Март 15, 2016, 13:08 Сделать отдельный виджет, поддерживающий выделение элементов, драг-дроп и прочие вещи - ПРОЩЕ? Нет, НАМНОГО проще :)Толсто, батенька :) Название: Re: Нужен совет в выборе инструмента Отправлено: Vitto74 от Март 15, 2016, 13:12 Про масштабирование я как-то не подумал. Тут у QGraphicsScene альтернативы просто нет.
Сделать отдельный виджет, поддерживающий выделение элементов, драг-дроп и прочие вещи - ПРОЩЕ? Нет, НАМНОГО проще :)Не толсто. Если смотреть на базовый функционал на QWidget он действительно делается проще. А вот со всякими плюшками, такими как масштабирование, линии и кривые уже сложнее выходит. Название: Re: Нужен совет в выборе инструмента Отправлено: Racheengel от Март 15, 2016, 13:15 Если смотреть на базовый функционал на QWidget он действительно делается проще. А вот со всякими плюшками, такими как масштабирование, линии и кривые уже сложнее выходит. А что такое базовый функционал то? Это обработка кликов плюс paintEvent, вам все равно всю отрисовку и всю логику перетаскивания вручную программировать в таком случае. Правда не понимаю, как это может быть проще :) Название: Re: Нужен совет в выборе инструмента Отправлено: Vitto74 от Март 15, 2016, 13:19 Планировалось, что на карте будут находится потомки QWidget, каждый из которых логически представляет собой узел сети. Вся логика работы заложена именно в эти потомки, а от карты требуется только перетаскивание, которое делается очень просто. Но только сейчас я понял, что этого в принципе не достаточно.
В общем выбор сделан. QWidget не достаточно гибок для решения моей задачи, поэтому сама постановка моего вопроса оказалась не верной. В моём случае QGraphicsScene - это единственный возможный выбор. Название: Re: Нужен совет в выборе инструмента Отправлено: Racheengel от Март 15, 2016, 13:26 Можно еще сюда глянуть: http://algoholic.eu/qnodeseditor-qt-nodesports-based-data-processing-flow-editor
Эта штука как раз на сцене основана. Название: Re: Нужен совет в выборе инструмента Отправлено: Igors от Март 15, 2016, 13:29 Нужно унаследовать QWidget и хранить внутри список линий. Потребуется ловить события мыши, искать линии по координатам клика и передвигать линии по хитрой логике (они же "типа" ломаные, хотя совсем не ломаные). С толщиной линий и попаданием по линии придется помучиться. Эх, мне б такие "мучения" :) Ну хорошо, допустим. Но как (или чем) поможет QWidget? Я так вижу что аж ничем, наоборот, его надо как-то ресайзить. QGraphicsItem - ну позволит выбирать линии и точки (придется иметь и то и это). Но ведь движение все равно самому, и как бы не хужее - ведь теперь надо перестраивать цепочку айтемов (вместо того чтобы просто изменить точку(и)). Тянуть "корову на баню" из-за мизерного ф-ционала? ДрагДроп не особо нужен... Да он и нафиг тут не нуженЕсли есть линия с координатами (X1,Y1)-(X2,Y2) и толщиной fat, то зная координату posX мы можем высчитать диапазон Y, который попадает в линию заданной толщины. Находите просто "расстояние от точки до отрезка" и его уже сравниваете Код
Планировалось, что на карте будут находится потомки QWidget, каждый из которых логически представляет собой узел сети. Вся логика работы заложена именно в эти потомки, а от карты требуется только перетаскивание, которое делается очень просто. Но только сейчас я понял, что этого в принципе не достаточно. Не понял логику/ход мысли. Причем тут QGraphicsScene и почкму без нее ну никак ???В общем выбор сделан. QWidget не достаточно гибок для решения моей задачи, поэтому сама постановка моего вопроса оказалась не верной. В моём случае QGraphicsScene - это единственный возможный выбор. Название: Re: Нужен совет в выборе инструмента Отправлено: Vitto74 от Март 15, 2016, 13:39 Можно еще сюда глянуть: http://algoholic.eu/qnodeseditor-qt-nodesports-based-data-processing-flow-editor Обязательно гляну.Эта штука как раз на сцене основана. Не понял логику/ход мысли. Причем тут QGraphicsScene и почкму без нее ну никак ??? Потому, что QWidget не масштабируется от слова никак. А если и да, то это придется делать с каждым узлом и еще перемещать их па карте пропорционально. И фон тоже изменять нужно. Про линии я вообще молчу.Повторюсь - без линий и зума проще использовать виджеты, а с ними - сцены. Название: Re: Нужен совет в выборе инструмента Отправлено: Racheengel от Март 15, 2016, 13:52 one more: http://qfsm.sourceforge.net/
Название: Re: Нужен совет в выборе инструмента Отправлено: Igors от Март 15, 2016, 13:56 Потому, что QWidget не масштабируется от слова никак. А если и да, то это придется делать с каждым узлом и еще перемещать их па карте пропорционально. И фон тоже изменять нужно. Про линии я вообще молчу. Впечатляет уверенность с которой это утверждается :) Что сложного в том же масштабировании виджетов? Ну умножить и поделить, сделать setGeometry и... все. Линии наоборот, куда проще рисовать самому, как уже говорилось выше. Про фон я вообще молчу :)Повторюсь - без линий и зума проще использовать виджеты, а с ними - сцены. Ну да ладно, решили так решили, умолкаю Название: Re: Нужен совет в выборе инструмента Отправлено: ViTech от Март 17, 2016, 13:07 А с помощью Qt Quick карту сети рисовать не подойдёт? Если рассматривается возможность использования QGraphicsScene, то вместо неё я бы предпочёл Qml и QtQuick.
Название: Re: Нужен совет в выборе инструмента Отправлено: Vitto74 от Март 20, 2016, 10:55 А с помощью Qt Quick карту сети рисовать не подойдёт? Если рассматривается возможность использования QGraphicsScene, то вместо неё я бы предпочёл Qml и QtQuick. Считайте меня ретроградом, но нет. Я предпочитаю более низкоуровневые инструменты. |