2017-05-20 6 views
0

아래와 같이 QMainWindow에서 상속받은 메인 클래스 GUIApplication이있는 Qt 애플리케이션이 있습니다. GUI에는 시작 버튼, 중지 버튼 및 QGraphicsScene이 있습니다.순환 의존성을 피하는 Qt

내 응용 프로그램은 직렬 포트 및 기타 자료에서 데이터를 읽고받은 내용에 따라 QGraphicsScene을 그립니다.

내 메인 GUI 클래스는 시작 버튼 등을 눌러 초기화해야하므로 내 직렬 포트 클래스에 대해 알고 있습니다. 괜찮습니다. 그러나 직렬 포트 클래스는 데이터 및 기타 자료 수신시 QGraphicsScene을 업데이트해야하므로 내 GUI 클래스와 통신 할 수 있어야합니다.

제 질문은 제 시리얼 포트 클래스가 GUI 클래스에 대해서도 잘 알고 있지 않다는 것입니다. 이것은 두 클래스 사이의 순환 의존성의 형태가 아닌가? 직렬 포트 클래스의 멤버에게 GUI 클래스에 대한 포인터를 가질 계획입니다. 이것이 유일한 방법입니까, 아니면 클래스를 분리하기 위해 직렬 포트 클래스에 콜백을 등록해야합니까? 어떤 도움을 주셔서 감사합니다.

// GUI class 
#include "MySerial.h " 
class GUIApplication : public QMainWindow 
{ 
    Q_OBJECT 

public: 
//......... 

// Serial port class 
#include "GUIApp.h " 
class MySerial 
{ 

public: 
//.............. 
//write something on GUI` 
+0

아마도 주제는 아니지만 ... [QSerialPort'] (http://doc.qt.io/qt-5/qserialport.html)를 사용하고 GUI 요소 (예 :) 적절한 신호에 연결 하시겠습니까? –

+0

주제를 벗어납니다. 다른 클래스에서도 GUI를 업데이트해야합니다. 나는 직렬 포트를 언급해서는 안됩니다. – Engineer999

답변

1

O_O이 나쁜 디자인입니다. 직렬 포트 클래스는 본질적으로 GUI와는 아무런 관련이 없으므로 순환 종속성과는 별도로 유연성이 떨어지며 유용성이 제한됩니다. 언젠가 당신은 콘솔 어플리케이션에서 그것을 사용하기를 원할 것입니다. 당신이 GUI 클래스를 알아야만하는 방식으로 클래스를 작성했다면, 콘솔과 함께 작동하도록 수정해야합니다. 두 버전 이는 UI에 관해서 만 의미가 다르거 나, Qt를 의존성으로 추가하는 것은 콘솔 앱에서 필요하지 않더라도 호환성을 깨뜨리는 것을 원하지 않는 경우에도 마찬가지입니다.

데이터가 수신 된 후 직렬 포트 클래스 나 일부 의미있는 리턴 코드에서 신호를 보내고 GUI 클래스가이 값을 캐치하여 QGraphicsScene 자체를 업데이트하는 것이 훨씬 더 나은 해결책입니다. 그렇게하면 순환 종속성을 제거 할 수 있습니다.

+0

감사. GUI 코드를 잡으려면 GUI 코드가 직렬 포트 클래스를 폴링하거나 콜백을 사용해야 함을 의미합니까? 내 GUI 클래스에 속한 콜백 함수를 직렬 포트 클래스에 등록 할 수 있습니까? 그게 최선의 선택일까요? – Engineer999

+0

문제 없습니다. 가장 간단한 해결책은 직렬 포트 클래스를 q_object로 만들고 신호를 GUI 클래스의 슬롯에 연결하는 것입니다. 폴링도 실행 가능한 옵션입니다. 프로그램이 정확히 무엇이고 요구 사항이 무엇인지에 따라 달라지기 때문에 어느 것이 더 나은지 알기가 어렵습니다. 콜백은 멤버 함수를 등록하기 때문에 매개 변수로 GUI 클래스에 대한 포인터를 가져야하므로 융통성이 없기 때문에 여기서 콜백을 사용하지 마십시오. – KjMag

+0

표준 C++ 11 구조체 std :: function과 std :: bind를 사용하여 콜백 메서드를 사용했습니다. 이제는 GUI 함수를 호출하는 직렬 포트 클래스에 콜백 함수를 등록 할 수 있습니다. 필자의 경우 두 개의 문자열을 사용하는 함수를 등록 할 수 있으므로 직렬 포트 클래스는 GUI 클래스에 전혀 의존하지 않습니다. 내 GUI 클래스에서 std :: bind를 사용하면 GUI 멤버 함수를 바인드하여 직렬 포트 클래스에 콜백을 등록 할 수 있습니다. – Engineer999