2013-12-11 3 views
3

Qt는 5.1을 사용하여 나는이 있습니다Q_PROPERTY 동기 이벤트를 읽기 위해 C++에서 QML로 신호가 방출되고 있습니까?

Q_PROPERTY(float d1 MEMBER data1 NOTIFY datas_changed_signal) 
Q_PROPERTY(float d2 MEMBER data2 NOTIFY datas_changed_signal) 

.... 

void setOBJ(nobj){ 
     obj=nobj; //these are pointers to a data structure 
     data1=nobj->data1(); //assign to member of this class 
     data2=nobj->data2(); 

     emit datas_changed_signal(); 
    } 

내 클래스는 일부 데이터, nobj에 대한 포인터를 수신 한 후 내 QML이 데이터에 액세스 할 수 있도록합니다. 실제로 nobj에는 단지 2 개 이상의 데이터 항목이 포함되어 있지만 여기서는 간단하게 설명합니다.

몇 가지 사실을 알고 싶습니다. 첫째, setOBJ이 자주 자주 호출되면 어떻게됩니까? setOBJ이 다시 호출되기 전에 QML에 알리고 MEMBER (data1 또는 data2)을 읽지 않을 위험이 있습니까? 이 때문에 QML이 일부 업데이트를 놓칠 수 있습니까? 예를 들어 비동기식 인 경우이 문제가 발생합니다. 또는, QML에서이 신호가 방출 될 때마다 항상 데이터를 가져올 수 있습니까?

둘째, 전달 된 개체의 데이터를 저장하기 위해 중간 데이터 멤버를 만드는 데 약간의 불필요한 오버 헤드가있는 것 같습니다. nobj.

Q_PROPERTY(float d1 MEMBER obj->data1() NOTIFY datas_changed_signal) 

을하지만 MOC는 (컴파일되지 않습니다) 이런 식으로 Q_PROPERTY를 사용하여 좋아하지 않는 것 : 내가 대신이 시도. 비슷한 대안이 있을까요?

업데이트 : C++에서 QML로 데이터를 전송하는 Q_PROPERTY 대신 실행 가능한 대체 코드 인 this method (link)이 발견되었으므로 데이터 조각을 QML 함수의 인수로 보낼 수 있습니다. 그게 좋은 대안인가?

답변

3

신호 및 슬롯은 기본적으로 동 기적으로 구현되며 비동기 적으로 구현되거나 스레드 경계를 넘어서 전달되는 경우에도 항상 순서대로 처리됩니다. 따라서 QML이 잘못된 순서로 신호를 받게 될지 걱정할 필요가 없습니다.

실제로 기본적으로 신호는 실제로 모든 바인딩 된 오브젝트 코드를 즉시 실행합니다. IE는이 :

emit datas_changed_signal(); 

거의 호출처럼인가 :

slotFunction1(); 
slotFunction2(); 
... 

그래서 연결된 QML의 자바 스크립트 (onDatas_changed_signal이) 사실, 즉시 호출됩니다.

신호와 슬롯은 CML 기본 모델과 독립적 인 QML을 훨씬 더 많이 지원하므로 데이터를 QML로 보내는 것이 좋습니다. 따라서 속성, 신호 및 슬롯을 고수 할 것입니다. 귀하의 QML 코드는 언젠가 확장되어야하고 속성 변경시 여러 가지 일이 생길 수 있습니다. QML 기능을 직접 호출하는 대신 속성을 통해 간단하고 매끄럽게 처리 할 수 ​​있습니다.

+0

Q_PROPERTY를 사용하여 동일한 데이터를 QML에 보내고 invokable 메서드를 통해 동일한 데이터를 보내는 테스트를 수행했습니다. 내 데이터가 자주 변경되고 invokable 메서드에는 데이터가 손실되지 않았습니다. 하지만 Q_PROPERTY가 onDataMember 변경된 신호를 사용하면 많은 데이터가 삭제되었습니다. 배후에 어떤 종류의 대기열 작업이 존재하고 QML이보기 전에 C++ 데이터가 변경 될 수도 있습니다. – johnbakers

+0

데이터 변경시 슬롯이 호출되고 있습니까? – Mercurial

+0

일반적으로 QML은 종종 (예 : 모달과 같은 상태를 갖는) GUI 함수를 호출하기 때문에 QML을 사용할 때 더 많이 동시성을 고려해야 할 것입니다. 다른 신호를 처리하기 전에 완료해야 할 수도 있습니다. 동시성 문제의 증상은 다른 플랫폼에서 다를 수 있습니다. – bootchk