Qt에서 큰 이미지 (2GB +)를 여는 이미지 비주얼라이저를 만들고 있습니다. 큰 이미지를 512X512의 여러 타일로 나누면됩니다. 그런 다음 원본 이미지 크기의 QGraphicsScene을로드하고 addPixmap을 사용하여 각 타일을 QGraphic Scene에 추가합니다. 궁극적으로 최종 사용자에게 거대한 이미지처럼 보입니다. 실제로 작은 이미지가 연속적으로 배열되어있어 장면에 함께 붙어 있습니다. 우선이 방법이 좋은 방법입니까?QGraphicsScene 및 QGraphicsView로 타일링
모든 타일을 장면에로드하려고하면 많은 양의 메모리가 사용됩니다. 그래서 볼 수있는 타일 만로드 할 생각입니다. 나는 이미 QGraphicsScene을 서브 클래스 화하고 그것의 드래그 이벤트를 오버라이드 (override)함으로써, 어떤 타일이 움직임에 기반하여 다음에로드 될 필요가 있는지를 알 수있게했다. 내 문제는 스크롤바에서 움직임을 추적하는 것입니다. 스크롤바가 움직일 때마다 호출되는 이벤트를 만들 수있는 방법이 있습니까? 옵션이 아닌 QGraphicsView 서브 클래 싱.
대신로드 및 추가 픽스맵의, 픽스맵을 포장 클래스를 추가 한 경우에만로드 :
아주 좋습니다. 지옥에서 많은 일을 구할 수 있습니다. 나는 이것이 스크롤하는 동안 천천히 또는 말더듬을 것이지만 궁금해하고 있었다. 원래 계획했던 것은 마우스와 스크롤바 이벤트를 사용하여 사용자가보고있는 것을 추적하고 주변 타일을로드하여 별도의 스레드를 사용하여 미리 장면에 배치하는 것이 었습니다. 사용자가 장면을 따라 이동함에 따라 배경 스레드는 단순히 타일을로드하고 언로드합니다. QGraphicsItem 페인트가 이미 백그라운드에서이를 수행합니까? –
별도의 스레드에서로드하려는 경우 페인트 이벤트에서 이미지를로드하는 대신 작업자 스레드로 신호를 보내야하며 페인트가 호출 될 때마다 스레드에서로드 할 때까지 어떤 종류의 빈 이미지를 그립니다 . 타일이 실제로 보이기 전에'boundingRect()'가 페인트 이벤트를 트리거하기 위해 실제 크기보다 큰 값을 반환 할 수 있습니다. 그러나 조심하지 않으면 다른 부작용이있을 수 있습니다. – James
큰 도움을 주셔서 감사합니다. 거의 완료된 타일로드가 있습니다. 이제 타일을 내리는 가장 좋은 방법은 무엇입니까? 이전 게시물에서 이해 한 것부터, 장면의 모든 PixmapItem을 파괴하는 타이머를 실행하고 몇 초마다 NULL로 설정하는 것이 좋습니다. 그리고 페인트 메소드가 모든 업데이트에 대해 호출되기 때문에 현재보고있는 타일을 자동으로 복원합니다. 내가 맞습니까? –