Russian Qt Forum
Ноябрь 22, 2024, 23:55
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
2D и 3D графика
>
Соединение двух точек "проводами"
Страниц: [
1
]
2
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Соединение двух точек "проводами" (Прочитано 16840 раз)
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Соединение двух точек "проводами"
«
:
Февраль 15, 2015, 22:43 »
Стандартная задача - соединять две точки (QPointF в нашем случае) "проводами", которые проходят только по вертикали и горизонтали, и поворачивают только под прямым углом. При этом не накладываются на прочие элементы изображения, а другие подобные линии могут пересекать тоже только под прямым углом. Линии должны сами выбирать где им "ломаться" и сами должны располагаться на оптимальном расстоянии от других айтемов сцены. С возможностью изменять их положение драгом. Такие линии есть в Visio, OpenOffice Draw и других пакетах. Делалось многими и много раз. В самом Qt такой штуки, увы нет. Разумеется, и я сам могу сделать за несколько дней. Но может уже есть такое готовое для QGraphicsScene, типа набора QWT? Может не надо изобретать велосипед? Может есть сторонняя готовая библиотека? Или хотя бы, как называется такой тип объектов, но так чтобы при поиске не путаться в бесчисленных описаниях connection сигналов-слотов, QGraphicsLine и QRubberBand.
Записан
2^7-1 == 127, задумайтесь...
kamre
Частый гость
Offline
Сообщений: 233
Re: Соединение двух точек "проводами"
«
Ответ #1 :
Февраль 17, 2015, 07:05 »
Цитата: Гурман от Февраль 15, 2015, 22:43
как называется такой тип объектов
Пример документации из одной Java библиотеки
.
Записан
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Re: Соединение двух точек "проводами"
«
Ответ #2 :
Февраль 24, 2015, 22:45 »
up
С теорией более-менее ясно, что надо делать в общем, тоже более-менее ясно. Провести линии и вычислить обходы можно, подобное раньше делать приходилось. Разумеется, "провода" - это набор отрезков, концы которых соединены. Вот тут не вполне ясно,
как
это лучше делать на Qt. Точнее - какой вариант реализации самих проводов лучше:
- Хранить и отрисовывать QList<QGraphicsLine>
- Хранить QPainterPath, а на сцене рисовать QGraphicsPathItem( QPainterPath ), причем QPainterPath всегда будет
разомкнут
- теоретически можно еще хранить QList<QPointF>, и рисовать на сцене QGraphicsLine между этими точками - почти тоже самое, что в первом случае, но удалять линии со сцены муторно
Не ясно, будет ли нормально второй вариант работать с разомкнутым QPainterPath. Не видно - можно ли выделить отдельный участок QGraphicsPathItem другим цветом. Надо при наведении курсора на отрезок "провода" выделить этот отрезок цветом и определить его ориентацию, чтобы можно было его двигать только перпендикулярно отрезку. Как я вижу, QPainterPath предназначен больше для создания сложных
закрытых
объектов, которые оперируют, как единое целое. Поэтому склоняюсь к варианту с QList<QGraphicsLine>. В нем и выделение, и определение ориентации без особых проблем просматривается.
Кто-то делал что-то подобное? Каким путём?
Записан
2^7-1 == 127, задумайтесь...
lit-uriy
Джедай : наставник для всех
Offline
Сообщений: 3880
Re: Соединение двух точек "проводами"
«
Ответ #3 :
Февраль 27, 2015, 19:20 »
Провода обычно делают наследниками QGraphicsItem прямо или косвенно. провод знает к кому он подключен и при удалении провода сам отключается.
Базовую идею смотри в примере DiagramScene, подробности реальной реализации, например, во
Fritzing
и
QElectrotech
Записан
Юра.
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Re: Соединение двух точек "проводами"
«
Ответ #4 :
Февраль 27, 2015, 19:40 »
Цитата: lit-uriy от Февраль 27, 2015, 19:20
Провода обычно делают наследниками QGraphicsItem прямо или косвенно. провод знает к кому он подключен и при удалении провода сам отключается.
Базовую идею смотри в примере DiagramScene, подробности реальной реализации, например, во
Fritzing
и
QElectrotech
Спасибо, конечно, но это тот случай, когда советующий не вполне понял суть вопроса...
Записан
2^7-1 == 127, задумайтесь...
lit-uriy
Джедай : наставник для всех
Offline
Сообщений: 3880
Re: Соединение двух точек "проводами"
«
Ответ #5 :
Февраль 27, 2015, 20:33 »
Если ты про автоматическое расположение отрезков, то в QElectrotech именно так и сделано. При перемещении компонентов провода сами перестраиваются.
class Conductor : public QObject, public QGraphicsPathItem
Проводник содержит внутри себя
class ConductorSegment
«
Последнее редактирование: Февраль 27, 2015, 20:37 от lit-uriy
»
Записан
Юра.
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Re: Соединение двух точек "проводами"
«
Ответ #6 :
Февраль 27, 2015, 20:56 »
Цитата: lit-uriy от Февраль 27, 2015, 20:33
Проводник содержит внутри себя ...... class ConductorSegment
Вот это меня интересовало. Если у них можно после автоматической проводки перемещать проводники мышью, тогда интересно копать. Если нет, то нет.
Записан
2^7-1 == 127, задумайтесь...
lit-uriy
Джедай : наставник для всех
Offline
Сообщений: 3880
Re: Соединение двух точек "проводами"
«
Ответ #7 :
Февраль 28, 2015, 21:30 »
Да, можно.
При наведении мыша на сегментах появляются квадратные маркеры (рис. 1), за которые можно двигать сегмент, если двиганул за пределы геометрии, например, сегмент последний "привязанный" к элементу схемы (верхний правый сегмент на рисунке), то появляются дополнительные сегменты (рис. 2)
Записан
Юра.
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Re: Соединение двух точек "проводами"
«
Ответ #8 :
Февраль 28, 2015, 22:18 »
Вот это уже интересно - как они на QGraphicsPathItem это сделали. Спс, посмотрю.
ЗЫ: глянул, чё-то как-то муторно там сделано, кроме самого QGraphicsPathItem им пришлось хранить и фактически работать с двунаправленным списком сегментов. Почему-то не стали использовать QList. И если хранятся отрезки, то почему нельзя было их и нарисовать? Такое впечатление, будто авторы сначала сделали всё на QGraphicsPathItem, потом стало его не хватать, прилепили отрезки.
«
Последнее редактирование: Март 01, 2015, 01:06 от Гурман
»
Записан
2^7-1 == 127, задумайтесь...
lit-uriy
Джедай : наставник для всех
Offline
Сообщений: 3880
Re: Соединение двух точек "проводами"
«
Ответ #9 :
Март 03, 2015, 20:15 »
Я подробностей не знаю, но знаю что было так:
Был один программер, потом пришёл ещё один, видимо по опытнее, т.к. дело пошло быстрее, хотелки реализовывались. Сейчас развитие затормозилось, в истории хранилища, комитов от второго программера не видно, да и в "О программе" он пропал.
Т.е. первый, видимо, начал делать на QGraphicsPathItem, потом второй подключился стал перелапачивать код, а когда ушёл, всё осталось не доделанным.
может что-то не поделили.
Записан
Юра.
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Re: Соединение двух точек "проводами"
«
Ответ #10 :
Март 03, 2015, 22:18 »
Цитата: lit-uriy от Март 03, 2015, 20:15
Т.е. первый, видимо, начал делать на QGraphicsPathItem, потом второй подключился стал перелапачивать код, а когда ушёл, всё осталось не доделанным.
может что-то не поделили.
А. Вот это запросто. И видно, что недоделанно - обходить препятствия и не накладывать линии на уже проведенные тот алгоритм не умеет. По совокупности годится больше в качестве примера "как делать не надо".
Записан
2^7-1 == 127, задумайтесь...
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Соединение двух точек "проводами"
«
Ответ #11 :
Март 04, 2015, 09:46 »
Цитата: Гурман от Март 03, 2015, 22:18
А. Вот это запросто. И видно, что недоделанно - обходить препятствия и не накладывать линии на уже проведенные тот алгоритм не умеет. По совокупности годится больше в качестве примера "как делать не надо".
Ах как легко охаять чужую корову
А что же со своей?
Цитата: Гурман от Февраль 15, 2015, 22:43
Разумеется, и я сам могу сделать за несколько дней.
Это писалось 15 февраля, по всем меркам "несколько дней" уже истекли. Может товарищу надо быть скромнее?
На мой взгляд лучше начать с интерактивного перемещения (создания, удаления) отрезков - без всякого анализа пересечений. Это действительно "неск дней", чисто "дело техники". Начальный путь - как получится, пересек так пересек.
Ну вот, сейчас мурло опять выдаст типа "это ерунда!" - и разговор закончится
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Соединение двух точек "проводами"
«
Ответ #12 :
Март 04, 2015, 10:00 »
Цитата: Igors от Март 04, 2015, 09:46
Ну вот, сейчас мурло опять выдаст типа "это ерунда!" - и разговор закончится
По моему, мурло уже выдал.
Вас кто-то звал в эту тему? Почему вы считаете, что можете давать оценку другим, и тем более оскорблять людей?
Записан
kamre
Частый гость
Offline
Сообщений: 233
Re: Соединение двух точек "проводами"
«
Ответ #13 :
Март 04, 2015, 11:14 »
Цитата: Igors от Март 04, 2015, 09:46
Это писалось 15 февраля, по всем меркам "несколько дней" уже истекли. Может товарищу надо быть скромнее?
Поддержу вопрос
Igors
Думал, уже скоро топик стартер поделится своим решением этой не тривиальной, сделанным "за несколько дней". А пока что-то все чужое ищет...
Записан
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Re: Соединение двух точек "проводами"
«
Ответ #14 :
Март 04, 2015, 12:00 »
Цитата: kamre от Март 04, 2015, 11:14
Думал, уже скоро топик стартер поделится своим решением этой не тривиальной, сделанным "за несколько дней". А пока что-то все чужое ищет...
1. Напрасно думал. Делиться этим решением я никому не обещал и не планирую.
Может быть, буду продавать по LGPL, если хорошо получится.
2. Чужого не ищу. lit-uriy показал ответ на мой вопрос про варианты использования классов Qt, и он совпал с моими выводами. Задачу решаю абсолютно по-своему и всю сразу - с обходом препятствий, с исключением наложения соединителей, с соблюдением правил "отхода" от "разъемов". Это
не
тривиально, но без этого всего решение никому тут не нужно. И у меня нет дурацкой привычки пытаться перепрыгнуть овраг в два прыжка, если я знаю, что могу в один. Если кого-то сильно интересует - уже перелетел через середину оврага.
Записан
2^7-1 == 127, задумайтесь...
Страниц: [
1
]
2
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...