Пытаюсь подключить два QGraphicsItems
по прямая линия (QGraphicsLineItem
); щелкнув средней кнопкой мыши на первом объекте, затем наведите указатель мыши на второй объект, и после того, как я его отпущу, он должен провести линию между ними.
Это функция, которая должна связывать эти элементы.
void GraphicsBlock::connectBlocks(GraphicsBlock *block)
{
GraphicsConnect *connection = new GraphicsConnect(); //Class with QGraphicsLineItem
connection->line->setLine(QLineF(this->pos(), block->pos()));
}
Я работаю над одной сценой, и у меня проблема с поиском второго блока по положению мыши. Функция mousePressEvent
должна работать с таким кодом:
if (event->button() == Qt::MiddleButton)
Connecting == true;
и после этого mouseReleaseEvent
if (Connecting)
{
//Get object by mouse position here
//this.connectBlocks(..)
Connecting = false;
}
Я пробовал scene->itemsAt(mouse.x(), mouse.y(), QTransform())
и
scene->items(QPointF(mouse.x(),mouse.y())
, но всегда возвращал пустой список.
Обновлено: Вот как должно работать приложение, синий эллипс - это порт, на котором щелкнули, теперь я должен перетащить (все еще мышь вниз) на другой порт и отпустить мышь.
@eyllanesc Да, ты прав
Блоки всегда состоят из прямоугольника и трех кружков в верхнем левом?
@eyllanesc На данный момент да, может быть от одного до пяти портов
Я думаю, нам нужно больше информации по этому поводу. Агрегированы ли эти формы (прямоугольники и круги) внутри пользовательского производного класса QGraphicsItem
? Покажи нам реализацию. Я также предполагаю, что у вас есть собственный класс, унаследованный от QGraphicsView
. Это правильно? Это где вы обрабатываете события мыши?
Я решил это с помощью
QGraphicsItem *item = scene.itemAt(mapToScene(event->pos()), QTransform());
в функции mouseReleaseEvent
Выбранные элементы - это круги, а присоединяемые круги должны принадлежать разным портам. Я не ошибаюсь?