Поиск:

Ответ в темуСоздание новой темы Создание опроса
> QGaphicsView проблемы скроллинга и координат 
:(
    Опции темы
Glad
Дата 8.4.2014, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Приветствую!

У меня есть QGraphicsView. Я сделал функцию увеличения элемента(элемент это QGraphicsPixmapItem). То есть zoom. Когда я зумлю, 2 скроллбара изменяются при увеличении, а вот при уменьшении не меняются. Почему ? И что можно сделать для того, чтобы они уменьшались.. Я хочу просто перемещаться в пределах определенной области(мира). На данный момент мир у меня это картинка.
 
Еще проблема связанная с этим всем делом, что когда я кликаю в координату (100, 100), скажем, то если я сделаю скролл вниз, а потом кликну опять в ту же точку то она будет уже с другими координатами.. Т.е. надо преобразовывать информацию из экранных координат в координаты мира(картинки). Как получить эту информацию: т.е. информацию о том где в мире мы находимся ?

Заранее благодарю.
PM MAIL   Вверх
math64
Дата 8.4.2014, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

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



Рекомендуется указывать размеры сцены setSceneRect() на не полагаться на их автоматическое определение.
Для преобразования координат есть методы mapFromXXX() и mapToXXX().
PM   Вверх
Glad
Дата 8.4.2014, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(math64 @  8.4.2014,  14:34 Найти цитируемый пост)
Рекомендуется указывать размеры сцены setSceneRect() на не полагаться на их автоматическое определение.
Для преобразования координат есть методы mapFromXXX() и mapToXXX(). 

Спасибо! Попробую.


PM MAIL   Вверх
Glad
Дата 9.4.2014, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Еще несколько вопросов:
1. Я сделал зум. Но он работает правильно только с определенного расстояния. Есть картинка. По колёсику мышки я зумлю вьюшку следующим образом:
Код

void MapView::wheelEvent(QWheelEvent* event) 
{
    setTransformationAnchor(QGraphicsView::AnchorUnderMouse);

    double scaleFactor = 1.15;
    if(event->delta() > 0) 
        scale(scaleFactor, scaleFactor);
    else 
        scale(1.0 / scaleFactor, 1.0 / scaleFactor);
}


Картинка располагается в сцене. Вьюшка тоже привязана к сцене. 
Как должно работать: по движению колёсика мышки я должен увеличивать/уменьшать зум в ту область, в которой находится мышка. Но это у меня работает только для картинки почему то.. Как только картинку увеличиваю до определенного расстояния всё начинает правильно работать.. Если удалиться далеко, а потом зумить так, чтобы картинка сместилась вправо(допустим), картинка остаётся на месте. У меня есть подозрения что это как-то связано с системой координат setSceneRect. 

И.. еще нашёл прикол.. в QGraphicsPixmapItem есть метод scale возвращающий, как я думал масштаб. Так вот масштаб в матрице и масштаб возвращаемый через метод scale() разные! Иногда разработчиков Qt сложно понять.. 

PM MAIL   Вверх
math64
Дата 9.4.2014, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

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



Есть машсабирование всей сцены, а есть масштабировние айтемов.
для айтемов транформация явлается комбинацией scale(), rotation() и transform().
Поскольку transform() сам по себе может задать любую трансформацию, scale() и rotation() лучше не использовать.
Если размер сцены меньше размера вьюпорта, сцена может размещаться по центру или в левом верхнем углу. из-за этого картинка при зуме смещается.

PM   Вверх
Glad
Дата 9.4.2014, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(math64 @  9.4.2014,  15:40 Найти цитируемый пост)
Если размер сцены меньше размера вьюпорта, сцена может размещаться по центру или в левом верхнем углу. из-за этого картинка при зуме смещается.


Да, я понял. 

Цитата(math64 @  9.4.2014,  15:40 Найти цитируемый пост)
Есть машсабирование всей сцены, а есть масштабировние айтемов.
для айтемов транформация явлается комбинацией scale(), rotation() и transform().
Поскольку transform() сам по себе может задать любую трансформацию, scale() и rotation() лучше не использовать.


1. Угу, только вот зачем в одном Айтеме держать и то и другое ? 
2. Что будет со скейлом, если я осуществлю поворот ?
PM MAIL   Вверх
math64
Дата 10.4.2014, 07:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

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



scale() и rotation() оставлены для совместимости со старыми версиями.
в новых программах следует использовать только transformation() - с помощью которого можно сделать любую комбинацию поворотов относительно разных центров, масштабирования, отражений и т.д.
Если сделать сначала масшабирование (с разными масштабами по x b y), а потом поворот или наоборот - результаты будут разными. При использовании scale() и rotation() порядок предопределен, а трансформации можно делать в любом порядке.
Но объединенная трансформации хранится в виде матрицы, поэтому, узнать например, угол поворота будет невозможно.
PM   Вверх
Glad
Дата 10.4.2014, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(math64 @  10.4.2014,  07:32 Найти цитируемый пост)
scale() и rotation() оставлены для совместимости со старыми версиями.
в новых программах следует использовать только transformation() - с помощью которого можно сделать любую комбинацию поворотов относительно разных центров, масштабирования, отражений и т.д.
Если сделать сначала масшабирование (с разными масштабами по x b y), а потом поворот или наоборот - результаты будут разными. При использовании scale() и rotation() порядок предопределен, а трансформации можно делать в любом порядке.
Но объединенная трансформации хранится в виде матрицы, поэтому, узнать например, угол поворота будет невозможно. 


Спасибо!
PM MAIL   Вверх
math64
Дата 11.4.2014, 07:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

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



Цитата(Glad @  10.4.2014,  14:06 Найти цитируемый пост)
Спасибо!

Я ошибся. 
scale() и rotation() появились в Qt 4.6, а transform() в Qt 4.3
Видимо, для того, чтобы можно было узнать угол поворота и масштаб.
setScale() задает один масштаб по x b по у, а setTransformOriginPoint() исползуется для задания центра всех трансформаций, поэтому порядок setScale() и setRotation() не важен.

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

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

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


 




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


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

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