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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Нужен совет в выборе инструмента  (Прочитано 9130 раз)
Vitto74
Гость
« : Март 15, 2016, 10:45 »

Здравствуйте.
В связи переходом на Linux встала необходимость в замене программы FPinger на аналог, но для Linux аналогов, которые меня устраивают нет. Запускать под Wine не особо хочется, поэтому было решено сделать свою пинговалку с nmap и пингвинами. (Nagion и Zabbix не предлагать - уже есть)
В технической части особых вопросов у меня нет - liboping всё делает за меня, а nmap пока не в приоритете.
Вопрос в следующем - каким образом наиболее просто и удобно рисовать карту сети. Попробовал с наскока рисовать виджетами. Вполне получается - и двигать удобно, и подстраивать размер карты под расположение и события перехватывать и всё, что угодно делать, но только с виджетами. Можно еще попробовать сделать прямоугольники - скорее всего проблем также не возникнет. Но как сделать класс для отображения ломаной линии, чтобы не выдумывать абсолютно запутанную логику, да еще так, чтобы можно было произвольные вершины добавлять, у меня просто нет идей.
Можно пойти другим путем - использовать QGraphicsScene и создать свою логику работы со сценой, но этот путь более замудреный, хотя в перспективе более быстрый.
Резюмируя - чем удобнее рисовать ломанные линии, вершины которых можно двигать мышкой - с помощью виджетов или в QGraphicsScene? Или может быть я что-то пропустил или не знаю и моя проблема решается просто и изящно?
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #1 : Март 15, 2016, 11:05 »

QGraphicsScene удобней, однозначно.
Но если хочется полного контроля - то делать свой виджет, со своей отрисовкой и обработкой мыши.
Но это долго и нудно Улыбающийся
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Vitto74
Гость
« Ответ #2 : Март 15, 2016, 11:16 »

QGraphicsScene удобней, однозначно.
Спорно. Без линий основная логика укладывается менее чем в сотню строк.

Но если хочется полного контроля - то делать свой виджет, со своей отрисовкой и обработкой мыши.
Это в любом случае придется делать, но в QWidget это проще - кода меньше. Меньше кода - меньше багов.

Но это долго и нудно Улыбающийся
Потому и спрашиваю совета.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Март 15, 2016, 11:34 »

Резюмируя - чем удобнее рисовать ломанные линии, вершины которых можно двигать мышкой - с помощью виджетов или в QGraphicsScene?
И то и другое слишком "жирно", а с др стороны движение вершин все равно писать. Вообще надо исходить не из шкурных интересов "что удобнее" (как бы поменьше писать), а из "что правильно" (или "адекватно"), оно самым коротким и будет. Думается здесь это прямая отрисовка линий поверх в paintEvent
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #4 : Март 15, 2016, 11:59 »

Спорно. Без линий основная логика укладывается менее чем в сотню строк.
...
Это в любом случае придется делать, но в QWidget это проще - кода меньше. Меньше кода - меньше багов.

Сделать отдельный виджет, поддерживающий выделение элементов, драг-дроп и прочие вещи - ПРОЩЕ? Не верю Улыбающийся (с)...

Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Март 15, 2016, 12:16 »

Сделать отдельный виджет, поддерживающий выделение элементов, драг-дроп и прочие вещи - ПРОЩЕ?
Нет, НАМНОГО проще  Улыбающийся
Записан
Vitto74
Гость
« Ответ #6 : Март 15, 2016, 12:33 »

Думается здесь это прямая отрисовка линий поверх в paintEvent

[Рассуждения]
Нужно унаследовать QWidget и хранить внутри список линий. Потребуется ловить события мыши, искать линии по координатам клика и передвигать линии по хитрой логике (они же "типа" ломаные, хотя совсем не ломаные). С толщиной линий и попаданием по линии придется помучиться.
[/Рассуждения]
Записан
Vitto74
Гость
« Ответ #7 : Март 15, 2016, 12:54 »

Виджет проще в случае, если объекты на карте прямоугольные. ДрагДроп не особо нужен (хотя может палитру элементов запилить?), Выделение - тоже не проблема. А вот в QGraphicsScene логика и прямоугольников и линий задается одинаково сложно.
Мне почему-то не пришла в голову мысль, о том, что можно рисовать прямо на карте.

[Мысли вслух]
Если есть линия с координатами (X1,Y1)-(X2,Y2) и толщиной fat, то зная координату posX мы можем высчитать диапазон Y, который попадает в линию заданной толщины.
[/Мысли вслух]
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #8 : Март 15, 2016, 13:05 »

А как насчет масштабирования (зума), изменения размеров, множественного выделения, перетаскивания прямоугольников? В QGraphicsScene это уже "из коробки". А на виджетах свой велосипед лепить можно долго.

Я как-то делал подобное - и тоже стоял выбор между своим виджетом и сценой. В итоге выбрал сцену, сэкономил много времени. Да, косяки тоже были, но решились как-то Улыбающийся
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #9 : Март 15, 2016, 13:08 »

Сделать отдельный виджет, поддерживающий выделение элементов, драг-дроп и прочие вещи - ПРОЩЕ?
Нет, НАМНОГО проще  Улыбающийся

Толсто, батенька Улыбающийся
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Vitto74
Гость
« Ответ #10 : Март 15, 2016, 13:12 »

Про масштабирование я как-то не подумал. Тут у QGraphicsScene альтернативы просто нет.

Сделать отдельный виджет, поддерживающий выделение элементов, драг-дроп и прочие вещи - ПРОЩЕ?
Нет, НАМНОГО проще  Улыбающийся
Толсто, батенька Улыбающийся

Не толсто. Если смотреть на базовый функционал на QWidget он действительно делается проще. А вот со всякими плюшками, такими как масштабирование, линии и кривые уже сложнее выходит.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #11 : Март 15, 2016, 13:15 »

Если смотреть на базовый функционал на QWidget он действительно делается проще. А вот со всякими плюшками, такими как масштабирование, линии и кривые уже сложнее выходит.

А что такое базовый функционал то? Это обработка кликов плюс paintEvent, вам все равно всю отрисовку и всю логику перетаскивания вручную программировать в таком случае. Правда не понимаю, как это может быть проще Улыбающийся
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Vitto74
Гость
« Ответ #12 : Март 15, 2016, 13:19 »

Планировалось, что на карте будут находится потомки QWidget, каждый из которых логически представляет собой узел сети. Вся логика работы заложена именно в эти потомки, а от карты требуется только перетаскивание, которое делается очень просто. Но только сейчас я понял, что этого в принципе не достаточно.

В общем выбор сделан. QWidget не достаточно гибок для решения моей задачи, поэтому сама постановка моего вопроса оказалась не верной. В моём случае QGraphicsScene - это единственный возможный выбор.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #13 : Март 15, 2016, 13:26 »

Можно еще сюда глянуть: http://algoholic.eu/qnodeseditor-qt-nodesports-based-data-processing-flow-editor

Эта штука как раз на сцене основана.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Март 15, 2016, 13:29 »

Нужно унаследовать QWidget и хранить внутри список линий. Потребуется ловить события мыши, искать линии по координатам клика и передвигать линии по хитрой логике (они же "типа" ломаные, хотя совсем не ломаные). С толщиной линий и попаданием по линии придется помучиться.
Эх, мне б такие "мучения" Улыбающийся Ну хорошо, допустим. Но как (или чем) поможет QWidget? Я так вижу что аж ничем, наоборот, его надо как-то ресайзить. QGraphicsItem - ну позволит выбирать линии и точки (придется иметь и то и это). Но ведь движение все равно самому, и как бы не хужее - ведь теперь надо перестраивать цепочку айтемов (вместо того чтобы просто изменить точку(и)). Тянуть "корову на баню" из-за мизерного ф-ционала?  

ДрагДроп не особо нужен...
Да он и нафиг тут не нужен

Если есть линия с координатами (X1,Y1)-(X2,Y2) и толщиной fat, то зная координату posX мы можем высчитать диапазон Y, который попадает в линию заданной толщины.
Находите просто "расстояние от точки до отрезка" и его уже сравниваете
Код
C++ (Qt)
qreal Dist2Line( const QPointF & pos, const QPointF & p0, const QPointF & p1 )
{
QVector2D v0(p0 - pos);
QVector2D v1(p1 - pos);
QVector2D dir(p1 - p0);
if (QVector2D::dotProduct(dir, v0) * QVector2D::dotProduct(dir, v1) < 0)
 return QVector2D::distanceToLine(pos, dir.normalized());
 
return qMin(v0.length(), v1.length());
}

Планировалось, что на карте будут находится потомки QWidget, каждый из которых логически представляет собой узел сети. Вся логика работы заложена именно в эти потомки, а от карты требуется только перетаскивание, которое делается очень просто. Но только сейчас я понял, что этого в принципе не достаточно.

В общем выбор сделан. QWidget не достаточно гибок для решения моей задачи, поэтому сама постановка моего вопроса оказалась не верной. В моём случае QGraphicsScene - это единственный возможный выбор.
Не понял логику/ход мысли. Причем тут QGraphicsScene и почкму без нее ну никак Непонимающий
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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