Ненависти к Qt псто
lexa - 10/Апр/2014 10:05
А вот представим себе такое вот:
- QGraphicsView и QGraphicsScene
- Показываем картинку с каким-то увеличением, так что есть скроллбары (или только один)
- И хотим показать следующую картинку "примерно так же" (в смысле относительного положения окна просмотра относительно всей картинки)
- И хотим, чтобы когда мы вернулись к предыдущей - позиция сохранялась бы.
Ну вот казалось бы решение:
- Рассчитать какая (относительная, в координатах 0-1) точка исходной картинки расположена в центре экрана.
- Рассчитать далее, какая абсолютная точка следующей картинки должна быть в этом самом центре.
- Дальше - view->centerOn()
Почти - потому что есть скроллбары, они могут быть, они могут не быть, они могут быть у первой картинки, но не у второй (размеры другие) и наоборот. Скроллбары - меняют центр View (потому что занимают ширину).
И приходится нецензурно закатывать солнце вручную:
- Если исходно скроллбар есть - запоминаем его относительную позицию (где у нас value() между minimum() и maximum()). Если нет - берем запомненную ранее, когда скроллбар был.
- Дальше нужно посчитать, будет ли скроллбар при показе следующей (какой размер больше, картинки или viewport()
- Если не будет, то скроллбар надо явно выключить, потому что если разница в несколько пикселов, то его может включить.
- Если будет - то явно включить, доверять автоматике нельзя (бывает клево: view ставит скроллбары и зовет resizeEvent(). resizeEvent() знает, что режим у нас fit-to-screen и ресайзит картинку. view - видит что картинка поресайзилась, убирает скроллбары, зовет resizeEvent().....).
- И если скроллбар будет - то явно ему поставить value (пересчитать из предыдущего относительного)
- А если не будет - то припрятать относительное value до следующего раза, когда скроллбар появится.
Но, сука, 98 строк кода (считая пробелы). Вместо эдак 8-и, с которыми работает, но примерно.
Comments
Quick Time non penis canis
Quick Time non penis canis est.
Только это не Quick
Только это не Quick Time.
Кьюти. Просто Кьюти. qt-project.org
Сорри, я в танке.
Сорри, я в танке.
А если просто запомнить
А если просто запомнить матрицу через QGraphicsView::transform(), а потом её же восстановить?
Размер картинки то
Размер картинки то меняется.
Т.е. мне нужно сохранить "видимый размер"/"видимое положение", даже если размеры (немного) сменились.
Если размеры те же - проблемы нет.