Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: gil9red от Июль 06, 2013, 22:50



Название: [РЕШЕНО] Пару вопросов с QGraphicsView и QGraphicsScene
Отправлено: gil9red от Июль 06, 2013, 22:50
Здравствуйте.
Начал изучать QGraphicsView и QGraphicsScene.

Написал простой пример отрисовки кругов и по замыслу, когда тыкну на экран, все итемы переместятся в позицию курсора, вот только не выходит.
В чем ошибка? :)

PS. на скрине в консоле показана позиция курсора и всех итемов, но то что на окне как то не соответствуется.... ???

h:
Код:
class UGravitation: public QGraphicsView
{
    Q_OBJECT
    
public:
    UGravitation(QWidget *parent = 0);

private:
    void createGUI();
    void init();

protected:
    void mousePressEvent(QMouseEvent *event);
};


Cpp:
Код:
#include "UGravitation.h"

/// PUBLIC
UGravitation::UGravitation(QWidget *parent)
    : QGraphicsView(parent)
{
    createGUI();
    init();
}

/// PRIVATE
void UGravitation::createGUI()
{
    setRenderHints(QPainter::Antialiasing);

    setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

    setAlignment(Qt::AlignLeft);

    setScene(new QGraphicsScene());
    scene()->setSceneRect(0, 0, 400, 400);
}

void UGravitation::init()
{
    QSizeF sizeBalls(20, 20);

    for(int i = 0; i < 10; i++)
    {
        QGraphicsEllipseItem *ball = new QGraphicsEllipseItem();
        double x = qrand() % (int)(scene()->width() - sizeBalls.width() * 2);
        double y = qrand() % (int)(scene()->height() - sizeBalls.height() * 2);

        ball->setPos(x, y);
        ball->setRect(QRectF(ball->pos(), sizeBalls));

        int r = rand() % 255;
        int g = rand() % 255;
        int b = rand() % 255;
        int alpha = 255;

        ball->setBrush(QColor(r, g, b, alpha));
        ball->setPen(QPen(Qt::NoPen));

        scene()->addItem(ball);
    }
}

/// PROTECTED
void UGravitation::mousePressEvent(QMouseEvent *event)
{
    qDebug() << "pos" << event->pos();
    foreach(QGraphicsItem *item, scene()->items())
    {
        item->setPos(event->pos());
        qDebug() << "_ball pos" << item->pos();
    }

}


Название: Re: Пару вопросов с QGraphicsView и QGraphicsScene
Отправлено: vregess от Июль 07, 2013, 04:09
Попробуй преобразовать координаты мыши QGraphicsView::mapToScene().


Название: Re: Пару вопросов с QGraphicsView и QGraphicsScene
Отправлено: gil9red от Июль 07, 2013, 05:23
Координаты такие же.
В конце концов, я же запрашиваю позицию всех итемов у сцены, и показывается, что они одинаковые, тут явно дело не в позиции курсора :)


Название: Re: Пару вопросов с QGraphicsView и QGraphicsScene
Отправлено: Old от Июль 07, 2013, 05:58
А так?

Код
C++ (Qt)
void UGravitation::init()
{
       ...
       ball->setRect(QRectF(QPointF(0, 0), sizeBalls));
       ...
}
 


Название: Re: Пару вопросов с QGraphicsView и QGraphicsScene
Отправлено: gil9red от Июль 07, 2013, 06:42
Помогло :)
Почему? ???


Название: Re: Пару вопросов с QGraphicsView и QGraphicsScene
Отправлено: Old от Июль 07, 2013, 06:48
Почему? ???
Потому, что координаты объекта на сцене (setPos) и координаты круга на объекте (setRect) не одно и тоже. :)


Название: Re: Пару вопросов с QGraphicsView и QGraphicsScene
Отправлено: gil9red от Июль 07, 2013, 06:53
Не знал  :)
Теперь знаю и запомню ;D