Russian Qt Forum
Октябрь 01, 2024, 00:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Пару вопросов с QGraphicsView и QGraphicsScene  (Прочитано 5056 раз)
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« : Июль 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();
    }

}
« Последнее редактирование: Июль 07, 2013, 06:56 от gil9red » Записан

vregess
Гость
« Ответ #1 : Июль 07, 2013, 04:09 »

Попробуй преобразовать координаты мыши QGraphicsView::mapToScene().
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #2 : Июль 07, 2013, 05:23 »

Координаты такие же.
В конце концов, я же запрашиваю позицию всех итемов у сцены, и показывается, что они одинаковые, тут явно дело не в позиции курсора Улыбающийся
« Последнее редактирование: Июль 07, 2013, 05:26 от gil9red » Записан

Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #3 : Июль 07, 2013, 05:58 »

А так?

Код
C++ (Qt)
void UGravitation::init()
{
       ...
       ball->setRect(QRectF(QPointF(0, 0), sizeBalls));
       ...
}
 
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #4 : Июль 07, 2013, 06:42 »

Помогло Улыбающийся
Почему? Непонимающий
Записан

Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #5 : Июль 07, 2013, 06:48 »

Почему? Непонимающий
Потому, что координаты объекта на сцене (setPos) и координаты круга на объекте (setRect) не одно и тоже. Улыбающийся
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #6 : Июль 07, 2013, 06:53 »

Не знал  Улыбающийся
Теперь знаю и запомню Смеющийся
Записан

Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.099 секунд. Запросов: 21.