2011-08-13 4 views
8

Qt에서 GUI 응용 프로그램을 개발 중입니다.로직 및 UI 분리

이것은 첫 번째 GUI 응용 프로그램이며 경험이 없으며 C++ 및 Qt 프레임 워크의 고급 기능과 씨름해야합니다.

응용 프로그램은 매우 간단합니다. 사용자가 설정을 구성하고 버튼을 누르면 대화 상자가 나타나고 프로그램은 (매우 복잡한) 계산을 수행하여 UI의 어딘가에서 결과를 제공합니다.

이제 문제가 있습니다. 모든 계산 데이터 (정적이고 리소스에서로드 됨)와 로직을 별도의 클래스에 넣습니다. 이 클래스와 UI 클래스의 인스턴스를 만듭니다. 이제 문제는 UI 클래스에서 데이터/로직 클래스의 멤버에 액세스하는 방법입니다. Logic 클래스에 QStringList가 있고,이 목록에 액세스하여 사용자에게 제시하고 싶습니다. 메모리에 복사본을 만들지 않고 말하십시오.

나는 이것이 매우 기본적인 C++ 질문 (Qt는 관련 없음)을 이해하지만, 모두가 프로그래밍 마법사가 아닙니다. 어떤 힌트 나 도움을 주셔서 감사합니다!

답변

12

질문을 유효하게하는 몇 가지 방법이 있습니다.

  1. 사용자의 GUI 클래스는 Logic 클래스에서 파생 될 수 있습니다. 일반적인 접근법이 아니라 응용 프로그램 설계 방식에 따라 다릅니다. 하나의 큰 단점은 GUI가 로직과 동일한 스레드에 있어야한다는 것입니다. 많은 양의 계산으로 GUI가 멈추지 않도록 여러 스레드에서 클래스를 실행하려는 경우가 많습니다.

  2. GUI 클래스에는 논리 클래스에 대한 포인터 및/또는 그 반대가있을 수 있습니다. 또한 논리 클래스가 GUI 클래스 앞에 존재하고 그 논리 클래스가 살아남은 경우에도 편의상 참조 할 수 있습니다. 그런 다음 GUI 클래스의 생성자에 대한 참조를 전달할 수 있으며 포인터가 유효한지 테스트 할 필요가 없습니다. 당신이 그들을 공개하거나 로직 클래스에 friend 클래스로 GUI 클래스를 정의하려면

  3. 귀하의 GUI 클래스는 직접 게터/세터를 통해 데이터 멤버에 액세스하거나 할 수 있습니다. getter를 사용하는 경우에도 const 참조를 반환 할 수 있으므로 복사 할 필요가 없습니다. QStringList와 같은 Qt 클래스는 또한 자체 참조 카운팅, 복사본을 피하는 쓰기 복사 메커니즘을 가지고 있습니다.

  4. GUI 클래스가 신호를 방출 할 수 있으며 Logic 클래스가 신호를받을 수 있습니다. Qt 신호/슬롯 메커니즘을 참조하십시오. "계산 시작"버튼과 같은 이벤트에는 매우 유용합니다. 신호에는 두 가지 장점이 있습니다. (a) 스레드를 통과 할 수 있지만 수신자가 주 루프가 아니면 조금 더 까다로워집니다. (b) 객체가 서로를 보지 않아도 (포인터가 통과하지 않음), 신호를 두 프로그램을 동시에 볼 수있는 프로그램의 모든 슬롯에 연결할 수 있습니다.

일반적으로 2와 3의 혼합을 사용합니다. getter를 사용하여 사용자에게 표시되는 논리 클래스의 데이터를 읽습니다. 액션을 유발하거나 데이터를 조작하려면 신호를 사용하십시오 (사용자가 선택하면 Logic 클래스가 반응해야 함).(-보기 - 제어 모델) 간단한 경우를 들어

, 단지 모델 -

+0

귀하의 포괄적 인 답변은 매우 도움이되었습니다. 이제 저는이 분리에 대해 훨씬 더 잘 이해하고 있습니다. 고맙습니다! – vedran

+0

감사! 이것들 중에서 "최고의 것"이 있습니까? –

+0

일반적으로 Qt 신호/슬롯 시스템을 사용하는 것이 좋습니다. 그러나 어쨌든 GUI를 위해 Qt를 사용하기 때문입니다. – ypnos

1

아마도 여기에 뭔가가 빠졌지 만 설정 도구를 통해 UI 클래스에 데이터 클래스를 삽입하고 데이터 클래스의 메서드를 공개로 공개하면됩니다. 대처 오버 헤드를 피하려면 데이터 클래스의 포인터 만 전달하면됩니다.

4

MVC라는 프로그래밍 모델이있다보기 충분하다. 모델은 데이터를 나타내고 View는 UI를 나타냅니다.

모델 클래스는 일부 인터페이스 설정/가져 오기를 제공합니다. 모델 클래스는 일반적으로 View 클래스에 대한 지식이 없지만 데이터가 변경되면 View 클래스에 일반적으로 알릴 수 있습니다 (Qt의 신호/슬롯을 사용하여 수행 할 수 있음).

View 클래스에는 Model 클래스에 대한 포인터가 있으며 모델 클래스에서 제공하는 인터페이스를 사용하여 데이터를 조작합니다.