2013-06-19 2 views
0

Qt 공유 라이브러리 (dll)와 Qt 애플리케이션 간의 통신을 위해 신호와 슬롯을 사용하는 실제 예제가 있습니다. 내 질문은 선호하는 방법인가, 아니면 Qt 공유 라이브러리를 다루는 더 좋은 방법인가? 여기에 세부 사항이 있습니다 :Qt 공유 라이브러리와 Qt 애플리케이션 간의 신호 및 슬롯 사용

내가 개발 한 응용 프로그램은 네트워크상의 장치를 청취하고 GUI를 업데이트하는 기능이 있습니다. 공유 라이브러리는 네트워크상의 디바이스를 리스닝하고 Qt 애플리케이션 모듈은 GUI 부분을 처리합니다.

Q_DECL_EXPORT/Q_DECL_IMPORT를 사용하여 공유 라이브러리 및 응용 프로그램에서 사용하는 공통 클래스를 내보내는 매크로가 있습니다. 이 공통 클래스는 QObject에서 파생되며 Qt 신호와 슬롯을 정의합니다. 이 공용 클래스는 공유 라이브러리 (dll)의 일부로 빌드됩니다.

쿼트 프로그램은 컴파일시 공유 라이브러리를 로딩 일반적인 클래스의 인스턴스를 생성하고 아래와 같이 인스턴스 Qt는 애플리케이션과 Qt는 공유 라이브러리 모듈 간의 신호 슬롯을 설정하는 것으로 사용

Qt는 동안에 응용 프로그램 초기화 :

// Create shared libray API class instance to access dll module features. 
mp_sharedlib_api = new shareLibAPIClass(this); 

이후 Qt는 응용 프로그램 :

// Connect signal/slot between shared library and Qt application 
connect(
    mp_sharedlib_api , SIGNAL(SignalUpdateGUIStatus(QString)), 
    this, SLOT(SlotUpdateGUIStatus(QString)) 
    ); 

이 D에 대한 올바른 방법인가 공유 라이브러리를 사용하는 Qt 프로젝트를 만드시겠습니까? 공유 라이브러리의 API 문서는 무엇으로 구성됩니까? API 문서가 공유 라이브러리가 전송/처리하는 신호와 슬롯을 나열합니까?

미리 감사드립니다.

+0

Qt가 공유 라이브러리라는 것을 잊고있는 것 같습니다. 그렇다면 신호와 공유 라이브러리에 문제가있을 수 있다고 생각하는 이유는 무엇입니까? –

답변

4

신호 및 슬롯을 통해 연결된 두 개의 라이브러리가 아니라 클래스/클래스 인스턴스 세트, 백엔드 관련 클래스 그룹 및 UI 관련 클래스 그룹을 생각해보십시오. UI 클래스는 백엔드 클래스를 사용합니다 (그러나 다른 방법은 없습니다). 이 두 클래스 집합이 서로 다른 라이브러리에 있다는 것은 배포의 구현 세부 사항이며 C++ 수준의 응용 프로그램 디자인과는 무관합니다. 모든 코드가 단일 응용 프로그램에 함께 연결되어 있어도 디자인 개념은 동일합니다.

단일 신호로 하나의 "공통 클래스"가있는 것은 signalUpdateGUIStatus(QString) 일 것입니다. 별도의 라이브러리이기 때문에 인터페이스를 단일 클래스 또는 신호로 제한 할 필요가 없습니다. 작은 인터페이스는 좋지만 백엔드 코드가 하나의 매우 특정한 종류의 업데이트 만 보내는 경우가 아니라면 "signalUpdateUIStatus (QString whatChangedEncodedAsString)"는 단일 클래스/신호를 통해 너무 많이 수행 할 것입니다. signalUpdateGUIStatus는 또한 UI가 있음을 백엔드 라이브러리가 알고 있다는 것을 의미합니다. 그렇게해서는 안됩니다. 정보를 표시하는 UI 나 전자 메일 (또는 무엇이든)을 통하는 봇 (bot)이 비즈니스가 아닌지 여부와 상관없이 네트워크상의 장치에 대한 정보 만 제공합니다.

LightSensorListener, TemperatureSensorListener 등과 같이 내 보낸 클래스가있는 공유 라이브러리를 가질 수 있습니다.이 라이브러리는 값이 변경 될 때 신호를 내보내는 QObject가 될 수 있지만 다른 Q_PROPERTY, 메서드 등을 가질 수 있습니다. 클래스는 애플리케이션에서 인스턴스화 된 다음 UI 코드에 연결됩니다.

응용 프로그램에서 Qt를 사용하는 방법을 생각해보십시오. 귀하의 도서관은 귀하가 네트워크에서 자료를 얻기 위해 귀하가 사용하는 다른 도서관입니다. QString, QWidget, QLineEdit 등을 사용하는 것과 같습니다.작성하고 UI와 상호 작용, 네트워크와 인터페이스 라이브러리의 클래스를 사용합니다 :

이의 우리의 도서관 "foo는"이 클래스 TemperatureSensor가 있다고 가정 해 봅시다 :

//file TemperatureSensor.h 

/** 
    * A temperature sensor on the network. 
    * yaddayaddayadda 
    */ 
class FOO_EXPORT TemperatureSensor { 
     Q_OBJECT 
     Q_PROPERTY(QString address READ address WRITE setAddress NOTIFY addressChanged) 
     Q_PROPERTY(bool available READ available NOTIFY availableChanged) 
     Q_PROPERTY(qreal temperature READ temperature NOTIFY temperatureChanged) 
public: 
     /** 
     * Creates a temperature sensor 
     * 
     * @param parent parent QObject 
     */ 
     explicit TemperatureSensor(QObject* parent=0); 

     /** 
     * Returns whether the device is currently available and delivering data 
     */ 
     bool available() const; 
     /** 
     * Returns the temperature reported by the sensor (In Celsius) 
     */ 
     qreal temperature() const; 

     /** 
     * Makes the device explode. Use with caution! 
     * Don't give this to little developers/children. 
     */   
     void blowUp(); 

     //address(), setAddress() etc... 
Q_SIGNALS: 
     /** 
     * The availability of the sensor changed 
     * 
     * @param available whether the sensor is now available 
     */ 
     void availableChanged(bool available); 
     void temperatureChanged(qreal); 
     void addressChanged(const QString&); 
}; 

그런 다음 응용 프로그램을, 당신은 단지 인스턴스를 생성하고 UI로를 연결 : 문서에 대해서는

TemperatureSensor sensor; 
sensor.setAddress("/tempsensors/1234"); 

TemperaturWidget widget; 
widget.show(); 
//connect signals from sensor, or pass the whole sensor instance, etc. 

, (내 보낸 즉, 모든) 라이브러리의 모든 공용 클래스를 문서화해야한다. 신호/슬롯은 보통 다른 "정상적인"방법처럼 문서화됩니다.

+0

깊이있는 설명을 제공해 주셔서 감사합니다. – Rak

+0

감사합니다. 내 공유 라이브러리에는 다른 클래스가 포함되어 있으며 장치 검색 옆에 다른 작업을 수행합니다. 그러나 공유 라이브러리는 다중 신호를 포함하는 'shareLibAPIClass'클래스 만 애플리케이션 모듈에 내 보냅니다. 내 구현은 수출 된 클래스의 인스턴스를 만들고 해당 내 보낸 클래스의 신호에 슬롯을 연결할 때 사용자의 설명과 일치한다고 생각합니다. 나는 신호에 대해 일반 용어를 사용해야한다 (GUI 용어는 피한다). 내가 볼 수있는 유일한 문제는 장치 구성을 시작하는 공유 라이브러리에 대한 응용 프로그램의 신호가 있다는 것입니다. 그걸 어떻게 다룰 지 모르겠습니다. 어떤 충고? – Rak

+0

앱에서 라이브러리까지 신호/슬롯을 통해 검색을 시작하면됩니다. 아마 상태 ("유휴", "검색") 및 잠재적 오류에 대한 정보를 제공하기 위해 일부 속성을 추가 할 수도 있습니다. –