디렉토리와 같은 트리 구조를 저장하고 편집(GUI)하는 가장 우아하고 안전하며 쉬운 솔루션은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1882666

문제

해결해야 할 약간 까다로운 문제가 있습니다.이것을 상상해 보세요:

내 응용 프로그램 중 하나는 스크립팅을 많이 사용해야 하므로 사용자에게 스크립트 조각을 작성하고 디렉터리와 같은 트리 구조로 구성하는 방법을 제공하는 것이 아이디어였습니다.이는 하위 디렉터리와 소스 파일이 있는 소스 코드 디렉터리와 매우 유사합니다.

데이터 클래스/저장

내가 직면한 첫 번째 문제는 전체 트리 구조를 (디스크와 런타임 시 애플리케이션 내에서) 저장하는 좋은 방법을 찾아야 한다는 것입니다.이를 위해 나는 다음과 같은 아이디어를 가지고 있었습니다.

  1. QObject의 부모/자식 기능을 사용하여 트리를 나타낼 수 있는 QObject 파생 클래스를 사용하십시오.이렇게 하면 부모 개체가 삭제되어도 해당 개체 삭제에 대해 걱정할 필요가 없습니다.
  2. 하위 항목의 QList(포인터 없음)와 각 그룹/스크립트의 속성을 저장하는 몇 가지 속성을 포함할 수 있는 간단한 클래스를 사용하십시오.
  3. 접근법 #2를 사용하되 정적 객체 대신 포인터를 사용하십시오. 이렇게 하면 그룹이나 트리의 일부를 함수 등에 전달해야 할 때마다 쓸모없는 복사를 피할 수 있습니다.
  4. SQLite(또는 유사한) 데이터베이스에 대한 라이브 백엔드를 사용하고 런타임에 쿼리합니다.이렇게 하면 전체 트리를 한 번에 로드하고 RAM에 유지하는 것을 피할 수 있습니다.
  5. 파일 시스템에서는 플랫 파일 및 디렉터리 구조를 사용합니다.하지만 객체에 대한 메타 정보를 저장할 방법이 없기 때문에 필요 이상으로 문제가 더 많이 발생한다고 생각합니다.

편집자

내가 직면한 다음 문제는 사용자가 전체 트리 구조를 편집하고 싶어한다는 사실입니다.그는 그룹이나 스크립트를 클릭하고, 스크립트 코드를 편집하고, 트리 내에서 디렉토리와 스크립트를 끌어서 놓기를 원합니다.따라서 도중에 전체 트리의 구조가 변경됩니다.

이로 인해 다음과 같은 문제가 발생합니다.

  1. 사용자가 편집기를 닫으면 "변경 사항을 저장 하시겠습니까?" 대화.실수로 기존 문서에 무언가를 입력했지만 변경 사항을 저장하지 않고 종료하는 텍스트 편집기와 비슷합니다.- 이를 위해서는 전체 트리의 복사본을 편집하고 필요할 때 애플리케이션 내의 기존 트리를 덮어써야 합니다.
  2. 드래그 앤 드롭을 허용하면 문제가 될 수 있습니다...
    • ...와 더불어 저장 접근 방식 #1:현재 QObject의 하위 순서를 변경하는 좋은 방법은 없습니다.또한 프로그램의 다른 부분이 객체에 액세스할 수 있는 동안 런타임에 객체를 이동하는 것은 좋은 생각이 아닙니다.
    • ...이게 더 쉬워요 저장 접근법 #2, 전체 트리가 단일 값처럼 처리되고 자식이 없기 때문에 이동하고 부모를 다시 지정해야 합니다.트리의 일부를 복사하면 모든 하위 항목 등이 자동으로 복사됩니다.불행하게도 이는 많은 오버헤드와 유연성 손실을 의미합니다(정확히 무엇이 변경되었는지 확신할 수 없기 때문에 전체 트리를 디스크에 다시 작성해야 합니다).

더 많은 생각이 떠오르면 이 질문을 조금 업데이트하겠지만, 다른 사람들은 이 문제를 어떻게 해결하는지 정말 궁금합니다.어떤 제안이나 아이디어라도 감사하겠습니다.:)

도움이 되었습니까?

해결책 2

지금까지 나는 전용 클래스를 사용하여 트리의 깊이를 제한하여 문제를 해결했습니다. 즉, 처리 해야하는 트리 깊이가 제한되어 있으므로 지금은 QtreetReeWidget과 정렬, 드래그 및 드롭 및 기타 멋진 기능을 허용하는 몇 가지 도우미 방법을 사용합니다.

다른 팁

좋은 사례를 보려면 QFileSystemModel을 살펴보는 것이 좋습니다.모델은 UI 응답성을 위해 별도의 스레드를 사용하여 자체 업데이트하고 캐시를 유지하는 등의 작업을 수행해야 합니다.잘 동작하는 모델은 편집기 작업을 더 쉽게 만들어줍니다.

또한 TreeItem 클래스를 생성하기 위해 QObject를 파생시키려고 합니다.기본 클래스에 대해 QSharedData를 사용한 공유 데이터 접근 방식이 좋을 것입니다.나는 또한 그 주문에 대한 속성을 가질 것입니다.이렇게 하면 사용자가 끌어서 놓거나 다른 방식으로 순서를 변경할 때 제어를 유지할 수 있습니다.데이터가 공유되므로 성능을 위해 개체 목록을 순서대로 유지하면 비용이 거의 들지 않습니다.

또한 다음을 살펴보세요. 모델테스트.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top