2013-08-22 4 views
2

나는 바닐라 C++ 응용 프로그램의 GUI 개발에 대해 알고 싶어요. 나는 대부분 명령 줄 응용 프로그램에서 경험이 있습니다. 지금까지 C++ gui에서의 나의 경험은 cout과 cin이다. 나는 WPF에서 약간의 경험을 가지고있다. (나는 단지 GUI 경험이 있다고 언급한다.) 이것이 나의 수준의 GUI 경험을 묘사하기를 희망한다. 이제 3D 디스플레이의 가능성을 가진 별도의 GUI가 필요한 애플리케이션을 개발하고 싶습니다. 물론 GUI API에 대한 선택 중 하나는 Qt입니다. 또한 인터넷에서 많은 정보를 읽은 후에는 코드 분리가 미래에 정말 도움이 될 것이라고 생각합니다.모범 사례 ++ 응용 프로그램

그래서 여기 내 질문에 간다 : 내 논리를 가능한 한 제네릭 (내 논리에서 winapi 또는 qt를 사용하지 않음)로 유지하고 GUI 부분 만 API (winapi 또는 qt)라고하면 가능합니까? 또는 로직 섹션에서 로직과 GUI 간의 동기화에 대한 코드를 추가해야합니다. 하나는 신호 및 Qt에서 슬롯이 가능하지만 신호와 슬롯을 아는 한 Qt 특정 있습니다 말할 수 있습니다. 표준 C++가 아닙니다. 여름에

, 내 질문에 난 내 논리가 표준 C++에 할 수있다 만 디자인 플랫폼 특정 GUI (독립 플랫폼/프레임 워크를 유지하기 위해)? 그렇다면 링크 또는 설명서 또는 도서를 제안 해주십시오. 샘플 코드 또는 구현은 'a wish come true'가 될 것입니다. 또한 코드 분리 전술에 대한 통찰력이 도움이 될 것입니다.

감사합니다!

편집 : 내 문제를 자세히 설명합니다. 별도의 GUI 및 논리 섹션이있는 응용 프로그램이 있습니다. gui는 WinAPI를 사용하고 사용되는 통신 모드는 Windows 메시지이므로 이전 사용자는 Logic에서 GUI와 통신하는 HWND 객체를 만들었습니다. 따라서 Logic에는 HWND가 있고 GUI에는 HWND가 있습니다. 나는이 접근법을 만족스럽지 못하다. 이유 중 하나는 로직 부분이 나중에 프로그래머가 아닌 사람에 의해 편집된다는 것입니다 (상수의 수정 또는 매개 변수 또는 반환 값을 변경하지 않고 기능 구현 변경). 그래서, 나는 단지 로직을 표준 포맷으로 유지하려고한다. 그래서 다시 한 번, C++ 및 GUI의 비즈니스 로직을 설계하는 데 도움을 줄 수 있습니다.

+0

모델보기 컨트롤러 '패턴'및 표현 추상화 제어 '패턴'을 검색하십시오. 이것은 당신을 도울 것입니다. – PermanentGuest

+0

@PermanentGuest이 디자인 패턴을 알고 있습니다. 내가 찾고있는 것은 API가 아닌 C++ 구현이다. – user21071987

+0

@ user21071987 "논리 형식을 표준 형식으로 유지"에 대한 의견 : 신호 및 슬롯을 몇 개 소개하면 코드에 많은 영향을 미치지 않습니다. 또한 C++을 사용하면 클래스를 직접 작성할 수 있습니다. Qt 클래스는 그 클래스와 다릅니다. 하나는 멤버 함수를 찾아야하고 어쨌든 그런 것들을 찾아야합니다 ... – HWende

답변

1

일부 스레드를 읽은 후, 자신의 질문에 대답하는 것이 나쁜 습관이 아니라는 것을 발견했습니다. 그래서 나는 내가 가진 대답을 나눌 것입니다.

외부 종속성을 사용하지 않고 C++ GUI 응용 프로그램을 빌드하는 표준 방법은 없습니다. gui와 logic 부분 간의 동기화는 항상 프레임 워크에 따라 다릅니다. 그래서, C++ GUI 애플리케이션을 개발하고 싶다면 논리 부분을 표준 C++에 넣을 수 없습니다. 그것은 로직 부분과 gui 부분을 전달할 외부 프레임 워크의 코드를 가지고 있어야합니다. 그렇게 말하면서 나는 다음과 같은 방법으로 길을 찾았다. 내 논리 부분을 정적 lib 안에 넣고 gui 부분에이 lib를 연결합니다. gui 섹션에서 코딩이 증가하지만 표준 C++에서 기본 기능을 유지합니다. 이 방법 (표준 C++의 함수 lib 및 프레임 워크 특정 코드의 시스템 작업)은 저에게 효과적입니다. 나는 바른 길을 가기를 바랍니다. :)

+0

당신의 접근 방식에 정말 궁금합니다. 여전히 좋은가/일 했는가? 이전에 같은 생각을 했었지만 나중에 프레임 워크 규칙을 따르거나 준수합니다. 그리고 내 모든 논리를 내 프레임 워크에서 요구하는 기본 방식으로 설정하면됩니다. GUI와 로직을 분리해야 할 때 특별한 경우가 있습니다. 예를 들어, 내 자신의 Windows 서비스에서 호출 한 동일한 논리를 갖기를 원할 때. – swdev

+1

나는 또한 당신의 리그에 합류했다고 말할 것입니다. 네이티브 C++ 커널을 개발하기 시작했지만, Qt를 광범위하게 사용하기 시작했습니다. 주로 커널의 일부인 특정 장치에 대해 Windows 메시지를 사용해야하기 때문입니다. 그러나 나는 정적 인 lib로 만드는 것에 대한 나의 견해에 여전히 고착되어있다. – user21071987

1

당신은 크게 Qt는 완전히 별개의 논리와 GUI 코드를 작성할 수 있습니다. 그러나 논리와 GUI 코드가 상호 작용할 수있게하면 훨씬 더 유용한 GUI를 만들 수 있습니다. Qt는 많은 것들 (QString, QVector <> 등)에 대한 자체 클래스를 가지고 있지만, 대부분 이것을 무시하고 원하는 경우 표준 라이브러리를 대신 사용할 수 있습니다.

그러나, 나는 그것을 전에 언급 한 바와 같이, 당신은 그들이 상호 작용하는 경우 훨씬 더 GUI를 구축 할 수있을 것입니다 완전히 때문에 로직 코드에서 Qt를 분리하려고 할 가치가 있다고 생각하지 않습니다. 간단한 예를 들어, 윈도우와 버튼만으로 매우 간단한 Qt GUI를 작성할 수 있습니다. 버튼을 누르면 로직 코드가 실행됩니다. 그러나 더 많은 상호 작용을 통해 신호 및 슬롯을 사용하여 GUI의 진행률 표시 줄을 업데이트하여 사용자가 논리 코드의 크기를 알 수 있습니다. 또한 Qt는 매우 휴대 성이 뛰어나 Windows, Mac 및 적어도 일부 Linux 배포판 용 프로그램을 빌드 할 수 있습니다.

또한 3D 디스플레이 요구 사항에 대한 최근 자신이 비슷한 일을하려고 발견하고 매우 유용이 예 발견 - http://qt-project.org/doc/qt-5.0/qtgui/openglwindow.html합니다.

+0

High five! (코멘트에 최소의 캐릭터 요구 사항으로 인해 간단한 하이 파이브를 게시 할 수 없습니까?:-) – HWende

+1

@HWende \t이 사이트의 "하이 5"버튼은 포스트의 왼쪽에 위쪽 화살표 모양입니다. –

+0

@CodyGray 글쎄, 나는 내 기사보다 더 좋은 글을 좋아하지 않는다. :-) – HWende

0

나는 바닐라 C++과 QT GUI 일부 프로젝트를 수행했다. 순수 Q ++ 코드에 QT 코드를 섞어 놓지 않는 아이디어는 항상 좋지만 많은 즐거움을 얻습니다. 일반적으로 예상보다 훨씬 정교한 GUI로 끝나고 코드에 더 잘/쉽게 연결하려고합니다. 신호와 슬롯은 GUI가 코드와 상호 작용할 수있게 해주는 정말 좋은 방법이지만 믹싱을 시작합니다 ...

TLDR : 코드를 혼합하여 사용하지 않으려는 이유에 대해 정말로 생각해보십시오. QT. 당신이 QTS 신호 &을 사용하는 모든 상호 작용을 할 관리하는 경우

... 그것은 해주시 GUI 및 논리, 어떤 방법을 혼합하지,하지만 당신의 인생 QStrings, QProcesses 또는 QThreads 같은 QT 클래스를 사용하여 훨씬 쉽게 될 수있다 슬롯 메커니즘을 사용하면 네이티브 QT GUI를 사용자 정의가 가능한 QT Quick (QML)로 변경하거나 멋진 외양과 애니메이션 등을 사용할 수 있습니다.

이것은 제 의견입니다.

+0

내 질문을 편집했습니다. 그것은 바닐라 C++를 사용하는 이유를 알려줍니다. 또한, 바닐라 C++과 gui 같은 다른 API에서 로직을 구현 했습니까? 어떻게 둘 다 그들을 연결 했습니까? 구현이나 다른 심판이 있습니까? – user21071987

+0

@ user21071987 모든 함수 등을 호출 할 수있는 QT C++ 래퍼 클래스를 작성할 수 있습니다. 그런 다음이 래퍼 클래스의 신호 및 슬롯을 사용하여 GUI를 인터페이스 할 수 있습니다. – HWende

1

기본적으로 비즈니스 로직과 프리젠 테이션 (GUI) 코드를 분리해야한다고 생각합니다. 웹 개발에서 가장 보편적으로 사용되는 패턴은 MVC이며, 기본 원칙에도 똑같이 적용됩니다.

그러나 이러한 분리는 고유 응용 프로그램에서 달성하기가 더 어려울 수 있습니다. 주로 이러한 아키텍처 문제를 해결 한 Symfony와 같은 프레임 워크가 없기 때문에 주로 기존 규칙을 따라 UI와 비즈니스 코드를 별도로 유지해야합니다. Qt를 사용하지는 않았지만 주로 GUI 툴킷이라는 것을 알고 있습니다. 모델, 뷰 및 컨트롤러는 잘 정의되고 통합되어 있지 않습니다.

필요한 인터페이스의 특성에 따라 간단한 OpenGL GUI로 충분할 수 있습니다. 이것이 내가 simple uni project을 위해 한 일입니다. 프로젝트는 통계에 따라 색상이 지정된 쉐이프 파일을 XML 파일에 표시해야했습니다. 버튼, 라벨 등의 GUI 위젯과 "비즈니스 로직"을 캡슐화하는 맞춤지도 위젯을 만들었습니다. 아마도 맵 웨어젯을 가능한 한 포괄적으로 만들고 모든 비즈니스 로직을 별도의 라이브러리로 옮겨야 할 것이지만 비즈니스 계층이 매우 얇은 것을 고려할 때 추가 된 복잡성이 이점을 능가 할 것이라고 생각했습니다.

또 다른 요소는 기술 설정 - 현재 및 개선하고자하는 분야입니다. 나는 OpenGL과 freeglut에 더 관심이 있었고 Qt를 배웠습니다. 내가 Qt를 알았다면 나는 그것을 사용했을 것이다.

+0

GUI와 로직을 연결하기 위해 향상 되었습니까? – user21071987

+0

@ user21071987 방금 함수 포인터를 사용하여 이벤트를 구현했습니다.별로 영리하지는 않지만 간단합니다. 나는 [boost :: signals2'] (http://www.boost.org/doc/libs/1_54_0/doc/html/signals2.html)로 전환 할 계획이었는데, 나는 그러한 작업을위한 올바른 해결책이라고 생각한다. . –

관련 문제