Как я могу обнаружить конфликт между изображениями QGraphicsItem и QGraphicsPixmapItem из разных классов

У меня есть элементы QGraphicsEllipse как пули в сцене. Цели - это изображения QPixmap, и я хочу, чтобы взаимодействовали только пули и изображения, а НЕ цель при столкновении с целью. Пули создаются в моем классе сцены, а QPixmaps создаются в моем классе диалога.

Я попытался добавить QList для QPixmaps, созданных аналогично QList QGraphicsItem *, но не думаю, что компилятору это понравилось. Мы ценим любые предложения.

void Scene::advance()
{
        QList <QGraphicsItem *> itemsToRemove;
        foreach( QGraphicsItem * item, this->items())
        {

            if( !this->sceneRect().intersects(item->boundingRect()))
            {
                // The item is no longer in the scene rect, get ready to delete it
                itemsToRemove.append(item);
            }
        }

        foreach( QGraphicsItem * item, itemsToRemove )
        {
            this->removeItem(item);
            delete(item);
        }

        QGraphicsScene::advance();
}

BoundRect включен в мой класс MainTarget

QRectF MainTargets::boundingRect() const
{
    qreal shift = 1;
        return QRectF(-w/2 -shift, - h/2
                      - shift, w + shift, h + shift);
}

QPainterPath MainTargets::shape() const
{
    QPainterPath path;
    path.addRect(boundingRect());
    return path;
}

ИЗМЕНИТЬ

class GraphicsCircle : public QGraphicsRectItem
// class for the pellets
{
public:
    GraphicsCircle(qreal dirx, qreal diry)
        : m_Speed(5)
        , m_DirX(dirx)
        , m_DirY(diry)
    {
        setRect(-3.0,-3.0,8.0,8.0);
        setPos(-140, 195);
        QRadialGradient rGrad( 0.0, 0.0, 20.0, 0.0, 0.0);
        rGrad.setColorAt(0.0, QColor(255,255,255));
        rGrad.setColorAt(0.7, QColor(255,255,225));
        rGrad.setColorAt(1.0, QColor(255,0,0,0));
        setBrush(QBrush(rGrad) );
        setPen(QPen(Qt::NoPen));
    }

    virtual ~GraphicsCircle() {}

    void advance(int phase)
    {
        if(phase == 0) return;
        setPos(x()+m_Speed*m_DirX, y()+m_Speed*m_DirY);
    }

private:
    qreal m_Speed;
    qreal m_DirX;
    qreal m_DirY;
};

Я изменил свой объект QPixmap на QGraphicsPixmapItems. Итак, вернемся к исходной проблеме, как столкнуть шарики, QGraphicsItems, с целями, QGraphicsPixmapItems. Я подумал, что это будет какая-то форма:

if(pellets->collidesWithItem(targets){
     remove(pellets)
     remove(targets)
 }

person user3353931    schedule 26.03.2014    source источник
comment
вы не ОБЯЗАНЫ использовать подпрограмму QT intersects, вы можете обнаружить столкновение вручную, используя геометрические модели.   -  person v.oddou    schedule 26.03.2014


Ответы (1)


Вместо QPixmap вы можете использовать QGraphicsPixmapItem и добавлять изображения в графическую сцену.

Кроме того, вы вызываете пересечения прямоугольника QGraphicsScene с ограничивающим прямоугольником элемента, который находится в его локальном координатном пространстве: -

if( !this->sceneRect().intersects(item->boundingRect()))

Поскольку они находятся в разных координатных пространствах, вам необходимо преобразовать boundingRect в координатное пространство сцены, прежде чем сравнивать

QRectF sceneBoundingRect = item->mapToScene(item->boundingRect);

Затем используйте это для сравнения

if( !this->sceneRect().intersects(sceneBoundingRect))
person TheDarkKnight    schedule 26.03.2014
comment
Ну, они уже добавлены в сцену. Просто не могу заставить пули и мишени взаимодействовать. - person user3353931; 26.03.2014
comment
Вы добавляете QPixmap в сцену с помощью scene-›addWidget или используете QGraphicsPixmapItem? - person TheDarkKnight; 27.03.2014
comment
У меня есть массив QPixmaps с сохраненными в них .jpg, и я выбираю один случайным образом и scene->addItem() - person user3353931; 28.03.2014
comment
QGraphicsScene::addItem принимает QGraphicsItem*. QPixmap нельзя передать этой функции. Либо вы используете QGraphicsPixmap, либо вызываете addWidget. - person TheDarkKnight; 28.03.2014
comment
Да, вы правы, я сохраняю изображения в QPixmaps, а затем сохраняю индекс в классе, который наследуется от QGraphicsItem. pmap = new MainTargets(main_targets[index], 1); MainTargets наследуется от QGraphicsItem и передается по ссылке. scene->addItem(pmap) Но растровое изображение добавляется после выбора случайного растрового изображения в массиве. - person user3353931; 28.03.2014
comment
Итак, вы создаете новый класс, наследующий QGraphicsItem. Как вы обрабатываете функцию boundingRect, которую здесь нужно перегрузить? Если это неправильно, это приведет к сбою коллизии при вызове scene-›intersects. - person TheDarkKnight; 28.03.2014
comment
Все boundingRect обрабатывается в классе MainTargets. Я предоставил строки кода в исходном сообщении выше. - person user3353931; 29.03.2014
comment
Если ваша фигура просто возвращает ограничивающий прямоугольник, вам не нужно его перегружать; он используется для неправильных форм. Я вижу проблему сейчас. Я добавлю это к ответу. - person TheDarkKnight; 31.03.2014
comment
везде, где я пытаюсь добавить строку для преобразования локальных координат в координаты сцены, возникает ошибка. Следует ли добавить это в метод продвижения сцены или в класс Maintargets? - person user3353931; 10.04.2014
comment
Где вы добавляете эту строку и в чем ошибка? - person TheDarkKnight; 10.04.2014
comment
У меня все еще есть первоначальная проблема отсутствия столкновения QPixmapsItems (цели) и QGraphicsItems (гранулы). Я добавил класс для гранул в исходную документацию, чтобы увидеть. Проблема в том, что у меня пули одного класса, а мишени — другого. Один наследуется от QGraphicsRectItem, а другой от QGraphicsScene соответственно. Думал, может быть, функция продвижения пуль столкнется с любой целью или пулей и исчезнет оба сталкивающихся предмета (когда я попробовал это в функции продвижения сцены, она удаляет только один из сталкивающихся предметов, а не оба). - person user3353931; 11.04.2014
comment
Один наследуется от QGraphicsRectItem, а другой от QGraphicsScene соответственно. Ни шарики, ни цели не должны наследоваться от QGraphicsScene. Они оба являются QGraphicsItems. - person TheDarkKnight; 11.04.2014
comment
Есть ли способ удалить и удалить элементы столкновения из класса QGraphicsItem, который у меня есть выше. Я только что вызвал столкновение элементов в методе продвижения пуль и скрыл и пулю, и цель. - person user3353931; 16.04.2014