Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Vitto74 от Март 15, 2016, 10:45



Название: Нужен совет в выборе инструмента
Отправлено: 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, который попадает в линию заданной толщины.
Находите просто "расстояние от точки до отрезка" и его уже сравниваете
Код
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 и почкму без нее ну никак ???


Название: 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.

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