짧은 답변
Qt의 MVC는 하나의 데이터 구조 에만 적용됩니다 . MVC에 대해 이야기 할 때 응용 프로그램이 당신에 대해 생각 안 QAbstractItemModel
나 QListView
.
전체 프로그램을위한 MVC 아키텍처를 원한다면 Qt는 그렇게 "거대한"모델 / 뷰 프레임 워크를 가지고 있지 않습니다. 그러나 프로그램의 각 목록 / 데이터 트리에 대해 실제로 보기 내에 컨트롤러 가있는 Qt MVC 접근 방식을 사용할 수 있습니다. 데이터 내 또는 모델의 외부이고; 이것은 사용중인 모델 유형에 따라 다릅니다 (자신의 모델 하위 클래스 : 모델 내부에있을 수 있음; 예 : QSqlTableModel : 모델 외부 (하지만 내부에 캐시 됨)). 모델과 뷰를 결합하려면 비즈니스 로직 을 구현하는 자체 클래스를 사용하세요 .
긴 대답
Qt의 모델 / 뷰 접근 방식 및 용어 :
Qt는 모델에 대한 간단한 보기 를 제공합니다 . 그들은이 컨트롤러 무엇 대부분의 경우 컨트롤러 "컨트롤"뭔가를 편집하고 항목을하는 이동, 선택 : 내장을. 즉, 사용자 입력 (마우스 클릭 및 이동)을 해석하고 모델에 적절한 명령을 제공합니다.
Qt의 모델 은 실제로 기본 데이터가있는 모델입니다. 물론 추상 모델은 데이터를 보유하지 않습니다. Qt는 데이터를 저장하는 방법을 모르기 때문입니다. 그러나 당신은 하위 클래스에 데이터 컨테이너를 추가하고 데이터에 액세스 모델 인터페이스를 만들어 사용자의 요구에 QAbstractItemModel을 확장합니다. 사실, 저는 여러분이 이것을 좋아하지 않는다고 가정합니다. 문제는 모델을 프로그래밍해야 한다는 것 입니다. 따라서 데이터 구조에서 데이터에 액세스하고 수정하는 방법이 있습니다.
MVC 용어에서 모델은 데이터 와 로직을 모두 포함합니다 . Qt에서 비즈니스 로직의 일부를 모델 내부에 포함할지 아니면 외부에 배치하여 자체적으로 "보기"가되는지는 사용자에게 달려 있습니다. 논리가 의미하는 바가 명확하지도 않습니다. 항목을 선택하고, 이름을 바꾸고, 이동합니까? => 이미 구현되었습니다. 그들과 함께 계산을합니까? => 모델 하위 클래스 외부 또는 내부에 넣으십시오. 파일에서 데이터를 저장하거나로드합니까? => 모델 하위 클래스 안에 넣으십시오.
내 개인적인 의견 :
좋은 제공하는 것은 매우 어렵다 및 프로그래머에 일반적인 MV (C) 시스템을. 대부분의 경우 모델이 단순하기 때문에 (예 : 문자열 목록 만) Qt는 바로 사용할 수있는 QStringListModel도 제공합니다. 그러나 데이터가 문자열보다 복잡한 경우 Qt 모델 / 뷰 인터페이스를 통해 데이터를 표현하는 방법은 사용자에게 달려 있습니다. 예를 들어, 3 개의 필드 (이름, 나이, 성별을 가진 사람)가있는 구조체가있는 경우 3 개의 필드를 3 개의 다른 열 또는 3 개의 다른 역할에 할당 할 수 있습니다. 나는 두 가지 접근 방식을 모두 싫어합니다.
Qt의 모델 / 뷰 프레임 워크는 간단한 데이터 구조 를 표시하려는 경우에만 유용하다고 생각합니다 . 데이터가 사용자 정의 유형 이거나 트리 또는 목록 (예 : 그래프)에 구조화되지 않은 경우 처리가 어려워집니다 . 대부분의 경우 목록으로 충분하며 어떤 경우에도 모델은 하나의 항목 만 보유해야합니다. 특히 다른 속성 (한 클래스의 한 인스턴스)을 가진 단일 항목을 모델링하려는 경우 Qt의 모델 / 뷰 프레임 워크는 사용자 인터페이스에서 논리를 분리하는 올바른 방법이 아닙니다.
요약하자면 Qt의 모델 / 뷰 프레임 워크는 Qt의 뷰어 위젯 중 하나에서 데이터를 보는 경우에만 유용하다고 생각 합니다 . 애플리케이션의 설정과 같이 하나의 항목 만 포함하는 모델에 대한 자체 뷰어를 작성하려고하거나 데이터가 인쇄 가능한 유형이 아닌 경우에는 완전히 쓸모가 없습니다.
(더 큰) 애플리케이션에서 Qt 모델 / 뷰를 어떻게 사용 했습니까?
나는 한때 (팀에서) 데이터를 관리하기 위해 여러 Qt 모델을 사용하는 애플리케이션을 작성했습니다. 우리는 DataRole
각기 다른 모델 하위 클래스에 대해 서로 다른 사용자 정의 유형 인 실제 데이터를 보관 하기 위해를 만들기로 결정했습니다 . 우리는 Model
모든 다른 Qt 모델을 보유 하는 외부 모델 클래스를 만들었습니다 . 또한 View
.NET 내부의 모델에 연결된 창 (위젯)을 보유 하는 외부 뷰 클래스를 만들었습니다 Model
. 따라서이 접근 방식은 우리 자신의 필요에 맞게 확장 된 Qt MVC입니다. 둘 다 Model
및 View
클래스 자체는 Qt MVC와 관련이 없습니다.
논리를 어디에 넣었 습니까? 소스 모델에서 데이터를 읽고 (변경된 경우) 결과를 대상 모델에 기록하여 데이터에 대한 실제 계산을 수행하는 클래스를 만들었습니다. Qt의 관점에서 볼 때이 로직 클래스는 모델에 "연결"되기 때문에 뷰가됩니다 (사용자의 경우 "뷰"가 아니라 애플리케이션의 비즈니스 로직 부분에 대한 "뷰").
컨트롤러 는 어디에 있습니까 ? 원래 MVC 용어에서 컨트롤러는 사용자 입력 (마우스 및 키보드)을 해석하고 모델에 명령을 제공하여 요청 된 작업을 수행합니다. Qt 뷰는 항목 이름 변경 및 이동과 같은 사용자 입력을 이미 해석하므로 필요하지 않았습니다. 그러나 우리에게 필요한 것은 Qt 뷰를 넘어서는 사용자 상호 작용의 해석이었습니다.