![]() |
|
|
![]()
|
|
| Glad |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 16.8.2005 Репутация: нет Всего: нет |
Приветствую!
У меня есть QGraphicsView. Я сделал функцию увеличения элемента(элемент это QGraphicsPixmapItem). То есть zoom. Когда я зумлю, 2 скроллбара изменяются при увеличении, а вот при уменьшении не меняются. Почему ? И что можно сделать для того, чтобы они уменьшались.. Я хочу просто перемещаться в пределах определенной области(мира). На данный момент мир у меня это картинка. Еще проблема связанная с этим всем делом, что когда я кликаю в координату (100, 100), скажем, то если я сделаю скролл вниз, а потом кликну опять в ту же точку то она будет уже с другими координатами.. Т.е. надо преобразовывать информацию из экранных координат в координаты мира(картинки). Как получить эту информацию: т.е. информацию о том где в мире мы находимся ? Заранее благодарю. |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Рекомендуется указывать размеры сцены setSceneRect() на не полагаться на их автоматическое определение.
Для преобразования координат есть методы mapFromXXX() и mapToXXX(). |
|||
|
||||
| Glad |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 16.8.2005 Репутация: нет Всего: нет |
||||
|
||||
| Glad |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 16.8.2005 Репутация: нет Всего: нет |
Еще несколько вопросов:
1. Я сделал зум. Но он работает правильно только с определенного расстояния. Есть картинка. По колёсику мышки я зумлю вьюшку следующим образом:
Картинка располагается в сцене. Вьюшка тоже привязана к сцене. Как должно работать: по движению колёсика мышки я должен увеличивать/уменьшать зум в ту область, в которой находится мышка. Но это у меня работает только для картинки почему то.. Как только картинку увеличиваю до определенного расстояния всё начинает правильно работать.. Если удалиться далеко, а потом зумить так, чтобы картинка сместилась вправо(допустим), картинка остаётся на месте. У меня есть подозрения что это как-то связано с системой координат setSceneRect. И.. еще нашёл прикол.. в QGraphicsPixmapItem есть метод scale возвращающий, как я думал масштаб. Так вот масштаб в матрице и масштаб возвращаемый через метод scale() разные! Иногда разработчиков Qt сложно понять.. |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Есть машсабирование всей сцены, а есть масштабировние айтемов.
для айтемов транформация явлается комбинацией scale(), rotation() и transform(). Поскольку transform() сам по себе может задать любую трансформацию, scale() и rotation() лучше не использовать. Если размер сцены меньше размера вьюпорта, сцена может размещаться по центру или в левом верхнем углу. из-за этого картинка при зуме смещается. |
|||
|
||||
| Glad |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 16.8.2005 Репутация: нет Всего: нет |
Да, я понял. 1. Угу, только вот зачем в одном Айтеме держать и то и другое ? 2. Что будет со скейлом, если я осуществлю поворот ? |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
scale() и rotation() оставлены для совместимости со старыми версиями.
в новых программах следует использовать только transformation() - с помощью которого можно сделать любую комбинацию поворотов относительно разных центров, масштабирования, отражений и т.д. Если сделать сначала масшабирование (с разными масштабами по x b y), а потом поворот или наоборот - результаты будут разными. При использовании scale() и rotation() порядок предопределен, а трансформации можно делать в любом порядке. Но объединенная трансформации хранится в виде матрицы, поэтому, узнать например, угол поворота будет невозможно. |
|||
|
||||
| Glad |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 16.8.2005 Репутация: нет Всего: нет |
Спасибо! |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Я ошибся. scale() и rotation() появились в Qt 4.6, а transform() в Qt 4.3 Видимо, для того, чтобы можно было узнать угол поворота и масштаб. setScale() задает один масштаб по x b по у, а setTransformOriginPoint() исползуется для задания центра всех трансформаций, поэтому порядок setScale() и setRotation() не важен. |
|||
|
||||
![]()
|
| Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |