Собственные объекты в QGraphicsScene - PullRequest
2 голосов
/ 03 января 2012

Я хотел бы иметь функцию перетаскивания на основе изображений. Если я перетаскиваю изображение, я хотел бы знать, какое изображение я выбрал и переместил (простая std :: string сделает для уникальной идентификации объекта, который представляет это изображение). Моя мысль - сохранить мой собственный объект (QPixmapItem) в QGraphicsScene:

#ifndef QPIXMAPITEM_H
#define QPIXMAPITEM_H

#include <QGraphicsPixmapItem>
#include <QPoint>

class QPixmapItem : public QGraphicsPixmapItem
{
public:
    QPixmapItem(std::string path, std::string id, int x, int y);
    std::string getIdentifier (){return this->identifier;}
    QPoint getPosition () const{return this->position;}

private:
    std::string identifier;
    QPoint position;
};

#endif // QPIXMAPITEM_H

Это метод, который я использую для добавления своих объектов на сцену:

void MainWindow::addPixmapItemToScene(std::string path, int x, int y)
{
    // generate pixmap item & add it to the scene
    QPixmapItem *item = new QPixmapItem(path, std::string("id123"), x, y);
    ui->roomView->scene()->addItem(item);

    // only update the affected area
    ui->roomView->updateSceneRect(item->pixmap().rect());
}

Вот как я пытаюсь «поймать» объект в QMouseEvent:

void MainWindow::mousePressEvent(QMouseEvent *event)
{
    std::cout << "mouse pressed" << std::endl;

    QGraphicsPixmapItem *currentItem = dynamic_cast<QGraphicsPixmapItem *>(childAt(event->pos()));
    if (!currentItem) {
        return;
    }
    std::cout << "item pressed" << std::endl;
}

Объекты добавляются на сцену, но всякий раз, когда я нажимаю на них, последняя строка («нажатие элемента») никогда не появляется на экране ..

Ответы [ 2 ]

1 голос
/ 03 января 2012

QGraphicsItem уже поддерживают перемещение посредством перетаскивания в пределах QGraphicsScene. Все, что вам нужно, это установить флаг QGraphicsItem::ItemIsMovable.

Если вы хотите получать уведомления, когда это происходит, переопределите QGraphicsItem::itemChange() в своем пользовательском QGraphicsItem.

0 голосов
/ 03 января 2012

childAt () не будет работать, потому что он возвращает QWidget, а QGraphicsPixMapItems не являются QWidgets (поэтому childAt () никогда не будет возвращать указатель на какой-либо QGraphicsItem, и даже если он каким-то образом это сделал, преобразование dynamic_cast вернет NULLв любом случае).

Чтобы получить список QGraphicsItems, которые пересекают указанную точку в сцене, вызовите QGraphicsScene :: items () для вашего объекта сцены.Затем выполните итерацию по возвращенному списку, чтобы узнать, что в нем содержится QGraphicsPixMapItems.

...