>

일부 사용자 정의 디자인 파일을 위해 qt로 파일 브라우저를 만들고 있습니다. 미리보기를 미리보기 이미지로로드하고 싶기 때문에 QIconProvider 를 사용하고 있습니다.  아이콘을 내 QFileSystemModel 로 되돌리려면 .

문제는 QIcon 를 생성하는 알고리즘입니다.  일부 리소스가 필요하므로 모든 미리보기 이미지로드가 완료 될 때까지 애플리케이션이 응답하지 않습니다.

내 pyzwyz를 넣을 방법이 있는지 궁금합니다  백그라운드 스레드에서 응용 프로그램이 응답하도록합니다.

QIconProvider
  • 답변 # 1

    허용 된 답변은 환상적입니다. 고급 Qt 개념을 소개했습니다.

    향후에이 작업을 시도하는 사람을 위해이 작업을 원활하게 수행하기 위해 변경해야 할 사항이 있습니다.

    제한 스레드 : QThreadPool 전달   QConcurrent::run 로 최대 스레드 수는 1 또는 2로 설정되어 있습니다. 기본값을 사용하면 모든 스레드가 이미지 미리보기를 작성하여 화상을 입었으므로 앱이 종료되었습니다. 병목 현상은 디스크이므로, 만들지 않습니다 이 작업에 1 개 또는 2 개 이상의 스레드가있는 것이 좋습니다.

    재 입력 금지 :아이콘 생성이 완료되기 전에 동일한 경로의 아이콘이 여러 번 쿼리되는 경우를 처리해야합니다. 현재 코드는 동일한 아이콘을 생성하는 여러 스레드를 생성합니다. 간단한 해결책은 QConcurrent :: run 호출 전에 플레이스 홀더 항목을 m_icons 맵에 추가하는 것입니다. 방금 기본 QIdentityProxyModel::data(index, QFileSystemModel::FileIconRole) 에 전화 이므로로드가 완료되기 전에 아이콘이 적절한 기본값으로 설정됩니다.

    작업 취소 :모델을 파괴하거나보기 폴더 등을 전환하려는 경우 활성 작업을 취소하는 방법이 필요합니다. 불행히도 보류중인 QConcurrent::run 를 취소하는 기본 방법은 없습니다.  태스크. 나는 std::atomic_bool 를 사용  작업이 실행하기 전에 확인하는 취소 신호. 그리고 std::condition_variable  모든 작업이 취소/완료 될 때까지 기다리십시오.

    도움말 :내 사용 사례는 디스크의 이미지 (예 : 일반적인 사용 사례)에서 미리보기 이미지를로드하는 것이 었습니다. 실험 후 미리보기를 생성하는 가장 빠른 방법은 QImageReader 를 사용하는 것입니다. , 미리보기 이미지 크기를 setScaledSize 에 전달 . 정사각형이 아닌 이미지가있는 경우 다음과 같이 적절한 가로 세로 비율로 크기를 전달해야합니다.

       const QSize originalSize = reader.size(); // Note: Doesn't load the file contents
        QSize scaledSize = originalSize;
        scaledSize.scale(MaximumIconSize, Qt::KeepAspectRatio);
        reader.setScaledSize(scaledSize);
    
    

관련 자료

  • 이전 SmartWatch 하드웨어 개요
  • 다음 Visual Studio 2015에서 폴리머 실행