![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
AlexandrosLiberalis |
![]()
Сообщение
#1
|
Новичок Группа: Новичок Сообщений: 8 Регистрация: 21.7.2014 Пользователь №: 4193 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Всем привет!
Новичок. Я делаю программу для рисования графов. Для рисования на QGraphicsScene есть два класса: Node и Edge. Эти классы рисуют вершины и дуги соответственно. Объект класса Node имеет флаг ItemIsMovable. При добавлении объекта Edge пользователь задаёт начальный и конечный объекты Node, которые в свою очередь дают координаты для рисования линии стрелки объекта Edge. После перемещения вершин, QGraphicsScene необходимо перерисовать, и пока я для этого использую кнопку на диалоге, в которой пишу код для рисования и в конце scene->update(); Как сделать перерисовку при перемещении вершины или её "отпускании"? Класс Node уже содержит метод mouseReleaseEvent() и, в моём понимании, его необходимо соединить с каким то слотом в главном диалоге, который в свою очередь всё перерисует. Подскажите пожалуйста, как это сделать. проект прилагаю.
Прикрепленные файлы
|
|
|
Trisch |
![]()
Сообщение
#2
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 379 Регистрация: 30.1.2012 Из: Запорожье Пользователь №: 3169 Спасибо сказали: 24 раз(а) Репутация: ![]() ![]() ![]() |
в методе mouseReleaseEvent() вы посылаете сигнал, который соединен с слотом, который в свою очередь все обновляет.
дополнительная инфа по сигналам и слотам Сообщение отредактировал Trisch - 17.8.2014, 11:43 |
|
|
AlexandrosLiberalis |
![]()
Сообщение
#3
|
Новичок Группа: Новичок Сообщений: 8 Регистрация: 21.7.2014 Пользователь №: 4193 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
В объявлении Node обозначил как сигнал
signals: void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); В объявлении главного диалога объявил слот public slots: void MySlot(); В реализации главного диалога написал: connect(node, SIGNAL(mouseReleaseEvent(QGraphicsSceneMouseEvent *event)), this, SLOT(MySlot())); Ещё вычитал, что в объявление класса sender'а нужно добавить Q_OBJECT Не работает. |
|
|
Trisch |
![]()
Сообщение
#4
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 379 Регистрация: 30.1.2012 Из: Запорожье Пользователь №: 3169 Спасибо сказали: 24 раз(а) Репутация: ![]() ![]() ![]() |
Нельзя void mouseReleaseEvent(QGraphicsSceneMouseEvent *event), сделать сигналом, так как это виртуальная функция.
надо определить новый сигнал и его уже послать из функции void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); К примеру:
Сообщение отредактировал Trisch - 17.8.2014, 15:24 |
|
|
lanz |
![]()
Сообщение
#5
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
Нужно менять своиства ребер соединеных с данной вершиной, а лучше всего сделать так:
1. В ребро добавить номера узлов которые оно соединяет(или указатели на эти узлы) 2. В методе paint ребра, спрашивать координаты концов у соответствующих узлов и рисовать их в этой точке. Тогда никакие сигналы.слоты не понадобятся, достаточно будет update, который уж есть в обработчике мыши.
Тут диалог вызывается два раза. Первый вызов можно безболезненно убрать. Вы так и не переделали работу с памятью. Assert при выходе. Используйте double вместо float. Экономить вам не зачем. Чтобы проще рисовать стрелки, рисуйте в системе координат конца линии, используйте методы QPainter::translate, QPainter::rotate. (edge + i) полностью эквивалентно edge[i] но последнее короче и проще читается. |
|
|
AlexandrosLiberalis |
![]()
Сообщение
#6
|
Новичок Группа: Новичок Сообщений: 8 Регистрация: 21.7.2014 Пользователь №: 4193 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Trisch,
Что то всё равно не получается, говорит " cannot convert parameter from Node to const QObject ", показывая на строчку connect(node, SIGNAL(mouseReleaseEvent(QGraphicsSceneMouseEvent *event)), this, SLOT(MySlot())); Нужно менять своиства ребер соединеных с данной вершиной, а лучше всего сделать так: 1. В ребро добавить номера узлов которые оно соединяет(или указатели на эти узлы) 2. В методе paint ребра, спрашивать координаты концов у соответствующих узлов и рисовать их в этой точке. Тогда никакие сигналы.слоты не понадобятся, достаточно будет update, который уж есть в обработчике мыши. Что то на это моего воображения не хватает. Хотя вроде я то же самое и делаю. В Edge есть переменные xstart, ystart, xend, yend, которым я присваиваю координаты соответствующих Node, делаю это в диалоге. А вот как запрашивать.... За остальные замечания спасибо, про память - это мне ещё предстоит одолеть, а пока программа периодически падает, перезапускаю проект и работаю снова(( |
|
|
Trisch |
![]()
Сообщение
#7
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 379 Регистрация: 30.1.2012 Из: Запорожье Пользователь №: 3169 Спасибо сказали: 24 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
AlexandrosLiberalis |
![]()
Сообщение
#8
|
Новичок Группа: Новичок Сообщений: 8 Регистрация: 21.7.2014 Пользователь №: 4193 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Trisch, Что то всё равно не получается, говорит " cannot convert parameter from Node to const QObject ", показывая на строчку В класс Node надо добавить макрос Q_OBJECT. По ссылке, что я дал выше, об этом написано. и это я сделал |
|
|
lanz |
![]()
Сообщение
#9
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
Цитата и это я сделал Надо наследовать тогда от QGraphicsObject http://qt-project.org/doc/qt-4.8/qgraphicsobject.html Что то на это моего воображения не хватает. Хотя вроде я то же самое и делаю. В Edge есть переменные xstart, ystart, xend, yend, которым я присваиваю координаты соответствующих Node, делаю это в диалоге. А вот как запрашивать.... На самом деле тут все просто. У вас проблема в том что вы храните одни и те же данные в двух местах, и их приходится синхронизировать. То что вам примерно надо:
|
|
|
afrit |
![]()
Сообщение
#10
|
Новичок Группа: Новичок Сообщений: 3 Регистрация: 12.2.2014 Пользователь №: 4053 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
в методе mouseReleaseEvent() вы посылаете сигнал, который соединен с слотом, который в свою очередь все обновляет. дополнительная инфа по сигналам и слотам Беда в том, что Node и Edge наследуются от QGraphicsItem, который в свою очередь о QObject ничего не знает, сигналы/слоты работать не будут. Как вариант, используйте QGraphicsObject или самостоятельно сделайте двойное наследование. А вообще, если я правильно понял задачу, посмотрите на http://qt-project.org/forums/viewthread/33448 |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 11.5.2025, 19:45 |