Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Движению объектов внутри QGraphicsView, Нужен совет по организации и реализации 
V
    Опции темы
kefir01
Дата 11.2.2011, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 22.6.2007

Репутация: 1
Всего: 2



Друзья!

Ищу вашего совета. Необходимо двигать объекты по QGraphicsView. Задача - картография. Много кусочков карт и нанесенные собственые объекты.

Хотелось бы узнать с чего стоит начать:
1) Где писать обработку движений - в самом QGaphiccsView или QGraphicsScene?
2) Можно ли двигать сцену и если да, то что для этого курить и откуда копать?
3) Как отрубить скролл? На Mac по-прежнему содержимое двигается жестами трэкбара.

Буду рад любой помощи.
PM MAIL   Вверх
kefir01
Дата 13.2.2011, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 22.6.2007

Репутация: 1
Всего: 2



Хм... неужто никто не двигал картинки? Или я спрашиваю что-то из разряда 2х2=4?
Я в общем-то хотел бы просто принцип понять можно без примеров))
PM MAIL   Вверх
asd
Дата 15.2.2011, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 25.6.2006

Репутация: нет
Всего: 1



1) Где писать обработку движений - в самом QGaphiccsView или QGraphicsScene?
Не совсем понятно, какого рода обработка. Смена позиции объекта? На сколько помню для этого нужно вызвать setPos для соответствующего объекта, который вы поместили на суену.

2) Можно ли двигать сцену и если да, то что для этого курить и откуда копать?
view->verticalScrollBar()->setValue(..)
view->horisontalScrollBar()->setValue(..)

3) Как отрубить скролл? На Mac по-прежнему содержимое двигается жестами трэкбара.
Совсем не понял, что требуется. Сделать скролбары невидимыми?
PM MAIL   Вверх
kefir01
Дата 16.2.2011, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 22.6.2007

Репутация: 1
Всего: 2



1) По движению мыши нужно передвигать все объекты карты. Кликнул, потянул - все потянулось. Причем 
setPos почему-то не работает. Также необходимо делать несколько инструментов для карт, а потому стандартное поведение не катит.

2) попробую..., но движение отдельных айтемов тоже понадобится

3) как скрыть я знаю. прокрутка срабатывает на жестах.
PM MAIL   Вверх
hexzo
Дата 16.2.2011, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 30.1.2011

Репутация: нет
Всего: нет



Цитата(kefir01 @  16.2.2011,  19:49 Найти цитируемый пост)
По движению мыши нужно передвигать все объекты карты. Кликнул, потянул - все потянулось.

Посмотри в документации пример Elastic Nodes Example.

Флажок у объекта класса  QGraphicsItem должен быть setFlag(ItemIsMovable).
PM MAIL   Вверх
kefir01
Дата 16.2.2011, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 22.6.2007

Репутация: 1
Всего: 2



Ставил такой флаг... все кусочки складываются в один QGraphicsItem - mapCanvas, которому при создании присватывается такой флаг.
вот 
Код

void QGSMap::mouseMoveEvent(QMouseEvent *event)
{
    if(mapIsMoving)
    {
        int deltaX = this->startX - event->pos().x();
        int deltaY = this->startY - event->pos().y();

        int xMin = this->viewportBounds.getMinX().toInt() - deltaX;
        int xMax = this->viewportBounds.getMaxX().toInt() - deltaX;
        int yMin = this->viewportBounds.getMinY().toInt() - deltaY;
        int yMax = this->viewportBounds.getMaxY().toInt() - deltaY;

        int mX = mapCanvas->pos().x() - deltaX;
        int mY = mapCanvas->pos().y() - deltaY;
        
        mapCanvas->setPos(mX, mY);


        setViewportBounds(xMin, yMin, xMax, yMax);

        this->startX = event->pos().x();
        this->startY = event->pos().y();
    }
}


Это сообщение отредактировал(а) kefir01 - 16.2.2011, 20:30
PM MAIL   Вверх
hexzo
Дата 16.2.2011, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 30.1.2011

Репутация: нет
Всего: нет



kefir01
У меня всё семейство кусочков таскается в таком минимальном примере.

Код

#include<QtGui>

int main(int argc, char **argv) {
    QApplication app(argc,argv);
    QGraphicsScene *scene = new QGraphicsScene;
    QGraphicsView *view = new QGraphicsView(scene);
    QGraphicsRectItem *rect = new QGraphicsRectItem(20,20,60,60);
    QGraphicsRectItem *rect2 = new QGraphicsRectItem(20,20,40,40, rect);

    rect->setFlags(QGraphicsItem::ItemIsMovable);
    rect2->setFlags(QGraphicsItem::ItemIsMovable);

    scene->addItem(rect);
    scene->addItem(rect2);

    view->show();
    return app.exec();
}


Это сообщение отредактировал(а) hexzo - 16.2.2011, 21:10
PM MAIL   Вверх
kefir01
Дата 16.2.2011, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 22.6.2007

Репутация: 1
Всего: 2



т.е. Может статься так, что родительский айтем не может таскать дочерние если они не имеют флага? Как-то не очень логично...
PM MAIL   Вверх
hexzo
Дата 16.2.2011, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 30.1.2011

Репутация: нет
Всего: нет



Родитель с флагом таскает дочерние без флага. А дочерние с флагом не таскают родителя без флага.
PM MAIL   Вверх
kefir01
Дата 16.2.2011, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 22.6.2007

Репутация: 1
Всего: 2



У родителя в моем случае есть флаг... может быть сцена должна быть больше объекта для того, чтобы его можно было таскать?
PM MAIL   Вверх
kefir01
Дата 17.2.2011, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 22.6.2007

Репутация: 1
Всего: 2



С прокруткой разобрался - убирается с помощью реимплементации wheelEvent.
Затупок с движением пока в процессе...
PM MAIL   Вверх
kefir01
Дата 21.2.2011, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 22.6.2007

Репутация: 1
Всего: 2



Разобрался с движением - имела место моя глупость: родительский айтем не выкладывался на сцену,.
Теперь все вроде как надо (даже дебагер выдает информацию о движении родительского айтема), только дети не отображаются совсем  smile 

Подозреваю, что это связано с тем, что надо правильно переписать paint() и boundingRect() у родительского айтема в свою очередь унаследованного от QGraphicsItem

Вот мой код layer.h

Код

#ifndef LAYER_H
#define LAYER_H

#include <QGraphicsItem>
#include <QPointF>
#include <QRectF>
#include <QPolygonF>
#include <QPainter>
#include <QPainterPath>
#include <QWidget>

class Layer : public QGraphicsItem
{
public:
    Layer(int layerId = -1, QString layerName = "", QGraphicsItem *parent = 0);

    QRectF boundingRect() const
    {

        return QRectF(pos(), QSizeF(10000.0, 10000.0)); //размер может меняться
    }

    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
               QWidget *widget)
    {
       painter->setRenderHint(QPainter::HighQualityAntialiasing);
        painter->drawLine(QPointF(0,0), pos()); //сделано для проверки
    }

    int getId();
    bool setId(int layerId);

    QString getName();
    bool setName(QString layerName);

signals:

public slots:

private:
    int layerId;
    QString layerName;

protected:
//    void mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent);

};

#endif // LAYER_H


PM MAIL   Вверх
kefir01
Дата 16.3.2011, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 22.6.2007

Репутация: 1
Всего: 2



Для тех кому интересно - простое решение заключается в том, чтобы наследоваться не от QGraphicsItem, а от QGraphicsItemGroup и с ней все отлично работает.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0990 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.